關於標準C語言的預定義巨集
阿新 • • 發佈:2019-01-29
標準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