標準C語言的預定義宏

轉載自:http://blog.csdn.net/hrbeuwhw/article/details/7484432


標準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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章