標準C語(yǔ)言預處理要求定義某些對象宏,每個(gè)預定義宏的名稱(chēng)一兩個(gè)下劃線(xiàn)字符開(kāi)頭和結尾,這些預定義宏不能被取消定義(undef)或由編程人員重新定義。下面預定義宏表,被我抄了下來(lái)。
__LINE__ :當前程序行的行號,表示為十進(jìn)制整型常量__FILE__ :當前源文件名,表示字符串型常量__DATE__ :轉換的日歷日期,表示為Mmm dd yyyy 形式的字符串常量,Mmm是由asctime產(chǎn)生的。__TIME__ :轉換的時(shí)間,表示"hh:mm:ss"形式的字符串型常量,是有asctime產(chǎn)生的。(asctime貌似是指的一個(gè)函數)__STDC__ :編輯器為ISO兼容實(shí)現時(shí)位十進(jìn)制整型常量__STDC_VERSION__ :如何實(shí)現復合C89整部1,則這個(gè)宏的值為19940SL;如果實(shí)現符合C99,則這個(gè)宏的值為199901L;否則數值是未定義__STDC_EOBTED__ :(C99)實(shí)現為宿主實(shí)現時(shí)為1,實(shí)現為獨立實(shí)現為0__STDC_IEC_559__:(C99)浮點(diǎn)數實(shí)現復合IBC 60559標準時(shí)定義為1,否者數值是未定義__STDC_IEC_559_COMPLEX__:(C99)復數運算實(shí)現復合IBC 60559標準時(shí)定義為1,否者數值是未定義__STDC_ISO_10646__ :(C99)定義為長(cháng)整型常量,yyyymmL表示wchar_t值復合ISO 10646標準及其指定年月的修訂補充,否則數值未定義
C 中還定義了__cplusplus
C語(yǔ)言中的__FILE__、__LINE__和__DATE__等都在頭文件include中
其他說(shuō)明:
如果編譯器不是標準的,則可能僅支持以上宏名中的幾個(gè),或根本不支持。記住編譯程序也許還提供其它預定義的宏名。__LINE__ 及 __FILE__ 宏指示,line指令可以改變它的值,簡(jiǎn)單的講,編譯時(shí),它們包含程序的當前行數和文件名。__STDC__ 宏指令的意義是編譯時(shí)定義的。一般來(lái)講,如果__STDC__已經(jīng)定義,編譯器將僅接受不包含任何非標準擴展的標準C/C 代碼。如果實(shí)現是標準的,則宏__STDC__含有十進(jìn)制常量1。如果它含有任何其它數,則實(shí)現是非標準的。__cplusplus 與標準c 一致的編譯器把它定義為一個(gè)包含至少6為的數值。與標準c 不一致的編譯器將使用具有5位或更少的數值。
常用宏的具體例子如下:
C語(yǔ)言中的__LINE__用以指示本行語(yǔ)句在源文件中的位置信息,舉例如下:
5
6
7
還可以通過(guò)語(yǔ)句line來(lái)重新設定__LINE__的值,舉例如下:
編譯執行后輸出結果為:
203
204
205
C語(yǔ)言中的__FILE__用以指示本行語(yǔ)句所在源文件的文件。
例如,test.c文件內容如下:
在gcc編譯生成a.out,執行后輸出結果為:
test.c
C語(yǔ)言中__DATE__和__TIME__表示時(shí)間和日期
結果:
Aug 26 202023:18:22
__STDC__是預定義宏。當它被定義后,編譯器將按照ansic標準來(lái)編譯你的c程序。
__cplusplus用來(lái)定義是否是C 編譯器
輸出結果為:
C
但是如果在前面定義_cplusplus
那么輸出就是:
C
C
另外gcc還支持__func__,和__FUNCTION__,它指示所在的函數,但是這個(gè)關(guān)鍵字不被windows下的vc6.0支持,舉例如下
其編譯后輸出結果為
main
main
注意: line、 __LINE__、 __FILE__" 及 __func__" 都是大小寫(xiě)敏感的。