ansi c標準規定可以在c源程式中加入一些「預處理命令」,來改進程式設計環境,提高程式設計效率。這些預處理指令都是由ansi c統一規定的,但是它並不是c語言本身的組成部分,不能直接對其進行編譯。
c語言和其它高階程式語言的乙個重要區別就是可以使用預處理指令和它的預處理功能。
預處理是指由預處理程式負責完成的在程式編譯之前的源**掃瞄。預處理過程掃瞄源**,對其進行初步的轉換,產生新的源**提供給編譯器。當對乙個原始檔進行編譯時,系統會使用預處理程式對源**中的預處理指令進行掃瞄,並做相應處理。
c語言的預處理功能主要有三種:
1. 巨集定義
在c語言源程式中允許用乙個識別符號來表示乙個字串,稱為「巨集」。被定義為「巨集」的識別符號稱為「巨集名」。在編譯預處理時,對程式中所有出現的「巨集名」,都用巨集定義中的字串去代換, 這稱為「巨集代換」或「巨集展開」。
(1) 不帶引數的巨集定義
用乙個制定的標示符來代表乙個字串,一般形式:
#define 標示符 字串
例如:#define a 3.14
這行**的作用就是用」a」來代表」3.14」,編譯程式時,將程式中所有的a都用3.14來代替。
使用示例:
示例1
#include #define pi 3.14
上面的**中,把圓周率pi的值巨集定義為3.14,然後在計算圓的面積時直接使用pi,即得出了圓的面積。
示例2
#include #define a 3
以上**可以看出,巨集定義相當於將標示符宣告為乙個常量,新巨集定義乙個標示符時,可以使用已定義的標示符。
需要注意的是,巨集定義標示符的使用,相當於將其複製過來使用,從a3的值即可看出。
(2) 帶引數的巨集定義
c語言允許巨集帶有引數。帶引數的巨集定義不是進行簡單的字元替換,還要進行引數替換。一般形式:
#define sum(x,y) x+y
上面的巨集定義中,定義兩個數的和為sum,兩個引數分別為x和y,這兩個引數也成為形式引數。在c程式中採用如下的格式使用該巨集定義:
s = sum(2,3);
上面的表示式中,將sum(2,3)巨集展開為2+3;相當於:
s = 2+3;
也就是說巨集定義中,將2和3當做巨集語句的實際引數代入巨集語句後展開,得出計算結果。
使用示例:
如上所述,巨集定義會將實際引數賦值給形式引數來使用巨集定義方法,實現計算圓的面積。
2. 檔案包含
檔案包含是c預處理程式的另乙個重要功能。檔案包含命令列的一般形式為: #include「檔名」 或
#include 《檔名》
注:」」一般用來包含一般原始檔,<>一般用來包含系統檔案。
#include預處理指令的作用是在指令處展開被包含的檔案。包含可以是多重的,也就是說乙個被包含的檔案中還可以包含其他檔案。標準c編譯器至少支援八重巢狀包含。
預處理過程不檢查在轉換單元中是否已經包含了某個檔案並阻止對它的多次包含。這樣就可以在多次包含同乙個標頭檔案時,通過給定編譯時的條件來達到不同的效果。
所謂檔案包含處理是指乙個原始檔可以講另外乙個原始檔的全部內容包含進來,即將另外的檔案全部包含在檔案中。
說明:(1) 在乙個被包含的檔案中還可以包含另外乙個被包含的檔案,即檔案包含是可以巢狀的。
(2) 在#include命令中,檔名可以用爽撇號或者尖括號括起來。兩者的區別在於,用<>時,系統到存放c庫函式標頭檔案的目錄中尋找要包含的檔案,這稱為標準方式。用」」時,系統先到使用者當前目錄下尋找要包含的檔案,若找不到,再按標準方式查詢。
(3) 乙個#include命令只能指定乙個被包含的檔案,如果要包含多個檔案,要用多個#include指令來完成。
(4) 如果檔案a包含檔案b,而檔案b有又要用到檔案c的內容,則可以在檔案a中用兩個#include命令來分別包含檔案b和檔案c,而且檔案c要在檔案b之前被包含,只有這樣檔案a和檔案b才可以都使用檔案c中的內容。這是因為預處理包含命令是順序執行的。
(5) 被包含檔案與其所在的檔案,在預處理包含命令之後已經成為同乙個檔案。被包含檔案中的所有資料,其所在的檔案都可以使用。
3. 條件編譯
預設情況下,源程式中所有**都會參與編譯。但是在有些情況下,程式設計有些特別的要求,需要部分源**參與編譯,設定條件,使其在一定的條件下才會參與編譯,這就是條件編譯。
條件編譯的命令有以下幾種方式:
(1)#ifdef 標示符
程式段1
#else
程式段2
#endif
作用:若所指定的標示符已經被#define命令定義過,則在程式編譯階段編譯程式段1;否則編譯程式段2;其中可以沒有#else部分。
使用示例:
(2)#ifndef 標示符
程式段1
#else
程式段2
#endif
作用:與第一種作用相反。若所指定的標示符已經未被#define命令定義過,則在程式編譯階段編譯程式段1;否則編譯程式段2;其中可以沒有#else部分。
(3)#if 表示式
程式段1
#else
程式段2
#endif
作用:若所指定的表示式值為真時,則在程式編譯階段編譯程式段1;否則編譯程式段2;其中可以沒有#else部分。
常見預處理指令
指令
用途#
空指令,無任何效果
#include
包含乙個源**檔案
#define
定義巨集#undef
取消已定義的巨集
#if如果給定條件為真,則編譯下面**
#ifdef
如果巨集已經定義,則編譯下面**
#ifndef
如果巨集沒有定義,則編譯下面**
#elif
如果前面的#if給定條件不為真,當前條件為真,則編譯下面**
#endif
結束乙個#if……#else條件編譯塊
#error
停止編譯並顯示錯誤資訊
預處理命令
和 操作符是和 define 巨集使用的.使用 使在 後的首個引數返回為乙個帶引號的字串.例如,命令 define to string s s將會使編譯器把以下命令 cout to string hello world endl 理解為 cout hello world endl 使用 鏈結 前後的...
預處理命令
我們可以在c源程式中插入傳給編譯程式的各中指令,這些指令被稱為預處理器指令,它們擴充了程式設計的環境。現把常用的預處理命令總結如下 1.預處理程式 按照ansi標準的定義,預處理程式應該處理以下指令 if ifdef ifndef else elif endif define undef line ...
預處理命令
1.以 開頭的預處理命令 預處理命令可以控制編譯器在進行編譯鏈結之前,對所寫的 進行一些其他的處理。所謂的預處理就是在編譯之前對程式的處理,所以預處理命令也叫做預編譯命令。符號是預處理命令特有的符號,c語言中凡是出現 的地方一定是預處理命令。編譯器通過 號來將我們寫的程式和預處理命令區分開的。c語言...