1. 程式人生 > >關於標準C語言的預定義巨集

關於標準C語言的預定義巨集

標準C語言預處理要求定義某些物件巨集,每個預定義巨集的名稱一兩個下劃線字元開頭和結尾,這些預定義巨集不能被取消定義(#undef)或由程式設計人員重新定義。下面預定義巨集表,被我抄了下來。

__LINE__  當前程式行的行號,表示為十進位制整型常量
__FILE__  當前原始檔名,表示字串型常量
__DATE__轉換的日曆日期,表示為Mmm dd yyyy 形式的字串常量,Mmm是由asctime產生的。
__TIME__ 轉換的時間,表示"hh:mm:ss"形式的字串型常量,是有asctime產生的。(asctime貌似是指的一個函式)
__STDC__ 編輯器為ISO相容實現時位十進位制整型常量
__STDC_VERSION__
如何實現複合C89整部1,則這個巨集的值為19940SL;如果實現符合C99,則這個巨集的值為199901L;否則數值是未定義 __STDC_EOBTED__ (C99)實現為宿主實現時為1,實現為獨立實現為0 __STDC_IEC_559__ (C99)浮點數實現複合IBC 60559標準時定義為1,否者數值是未定義 __STDC_IEC_559_COMPLEX__ (C99)複數運算實現複合IBC 60559標準時定義為1,否者數值是未定義 __STDC_ISO_10646__ (C99)定義為長整型常量,yyyymmL表示wchar_t值複合ISO 10646標準及其指定年月的修訂補充,否則數值未定義

實現還經常定義其他巨集用於傳遞環境資訊,如進行程式編譯工作的計算機型別。具體定義哪些巨集值是由實現決定的,但是UNIX實現習慣上預定義unix。與內建巨集不同的是,這些巨集可以取消定義。標準C語言要求特定實現的巨集名一下劃線開頭,加上大寫字母或另一個下劃線(unix巨集不符合這個要求)。

實際運用,例:預定義巨集可以在魔種錯誤訊息中使用:
if(n|=m)fprintf(stderr,"Internal error;line %d,file 5s\n",__LINE__,__FILE__);

其他實現定義的巨集可以分隔主機或特定目的碼。例如:Microsoft Visual C++定義__WIN32為1
#ifdef __WIN32 /*Code for Win32 environment*/ #endif __STDC__與__STDC_VERSION__巨集可以編寫與標準C語言和非標準C實現敬愛內容的程式: #ifdef __STDC__ /*Some version of Standard C*/ #if defined(__STDC__VERSION__)&&__STDC_VERSION__>=199901L /* C99 */ #elif defined(__STDC_VERSION__)&&__STDC_VERSION__>=199409L /*C89 and Amendment 1 */ #else /* C89 but not Amendment 1*/ #endif #else /* __STDC__not defined */ /*Not Standard C*/ endif