9、C語言之預處理命令
預處理命令
基本概念:ANSI C標準規定可以在C源程序中加入一些“預處理命令”,以改進程序設計環境,提高編程效率。
這些預處理命令是由ANSI C同一規定的,但是它們不是C語言本身的組成部分,不能直接對它們進行編譯(因為編譯程序不能識別它們)。必須在對程序進行通常的編譯之前,先對程序中這些特殊的命令進行“預編譯”
經過預處理後的程序可由編譯程序對預處理後的源程序進行通常的編譯處理,得到可供執行的目標代碼。
C語言與其他高級語言的一個重要區別是可以使用預處理命令和具有預處理的功能。
C提供的預處理功能主要有以下三種:
1、宏定義
2、文件包含
3、條件編譯
這些功能分別用宏定義命令、文件包含命令、條件編譯命令來實現。為了與一般C語言相區別,這些命令以符號“#”開頭。例如:#define #include
1、宏定義
不帶參數的宏定義
宏定義一般形式:
#define 標識符 字符串
#define PI 3.1415926
宏定義的作用時在本程序文件中使用指定的標識符PI來代替“3.1415926”這個字符串,在編譯預處理時,將程序中在該命令以後出現的所有PI都用“3.1415926”代替。這種方法使用戶能以一個簡單的名字代替一個長的字符串。
這個標識符(名字)稱為“宏名”
在預編譯時將宏名替換成字符串的過程稱為宏展開。#define是宏定義命令
說明:
(1)宏名一般習慣用大寫字母表示,以便與變量名相區別。但這並非規定,也可用小寫字母
(2)使用宏名代替一個字符串,可以減少程序中重復書寫某些字符串的工作量
(3)宏定義時用宏名代替一個字符串,只做簡單置換,不做正確性檢查,只有在編譯已被宏展開後的源程序時才會被發現語法錯誤並報錯。
(4)宏定義不是C語句,不必在行末加分號。如果加了分號則會連分號一起進行置換
(5)#define命令出現在程序中函數的外面,宏名的有效範圍為定義命令之後到本源文件結束。通常,#define命令寫在文件開頭,函數之前,作為文件一部分,在此文件範圍內有效。
(6)可以用#undef命令終止宏定義的作用域
(7)在進行宏定義時,可以引用已定義的宏名,可以層層置換
例如:
1 #include<stdio.h> 2 #define R 3.0 3 #define PI 3.1415926 4 #define L 2*PI*R 5 #define S PI*R*R 6 void main() 7 { 8 printf("L = %f \n S = %f",L,S); 9 }
帶參數的宏定義
作用:不是進行簡單的字符串替換,還要進行參數替換
帶參數的宏定義一般形式為:
#define 宏名(參數表) 字符串
字符串中包含在括弧中所指定的參數
如:#define S(a,b) a*b
2、文件包含處理
功能:一個源文件可以將另一個源文件的內容全部包含進來
一般形式:#include “文件名” // 先在當前目錄搜索,在搜索標準目錄
#include <文件名> //直接按標準目錄搜索
處理過程:預編譯時,用被包含文件的內容取代該預處理命令,再將“包含”後的文件作為一個源文件單位進行編譯,得到目標文件.obj
被包含文件的內容:
源文件(*.c)
頭文件(*.h)//宏定義,數據結構定義,函數說明等
文件包含可嵌套
預編譯後成為一個文件,因此file2.c中的全局靜態變量在file1.c中有效,不必在用extern聲明
3、條件編譯
概念:所謂“條件編譯”,時對部分內容指定編譯的條件,使其只在滿足一定條件才進行編譯
條件編譯命令的幾種形式:
(1)#ifdef 標識符 (2)#ifndef 標識符 (3)#if 表達式
程序段1 程序段1 程序段1
#else #esle #else
程序段2 程序段2 程序段2
#endif #endif #endif
9、C語言之預處理命令