C語言中文網 目錄
首頁 > 編程筆記 > C語言筆記 閱讀:1,323

C語言預定義的宏

凡是遵循 ISO C 標準的編譯器都必須定義下面 7 個宏。這些宏的名稱都是以兩個下劃線開始,以兩個下劃線結束

(1) __DATE__

它的替換文本是一個包含編譯日期的字符串字面量,日期格式為"Mmm dd yyyy"(例如:"Mar 192006")。如果天數小于 10,就在日的前面添加一個空格符。

(2) __FILE__

一個含有當前源代碼文件名稱的字符串字面量。

(3) __LINE__

一個整數常量,其值是當前源文件(包含宏 __LINE__ 引用的文件)的行號,從文件頭開始算起。

(4) __TIME__

一個包含編譯時間的字符串字面量,格式為"hh:mm:ss"(例如:"08:00:59")。

(5) __STDC__

整數常量 1,表示該編譯器遵循 ISO C 標準。

(6) __STDC_HOSTED__

如果當前實現版本是宿主環境下的實現版本,該宏為整數常量 1;否則,為常量 0。

(7) __STDC_VERSION__

如果編譯器支持 1999 年 1 月的 C99 標準,則該宏為長整數常量 199901L。如果編譯器支持 2011 年 12 月的 C11 標準,則該宏為長整數常量 201112L。

#line 命令可影響 __FILE__ 和 __LINE__ 宏的值。其他預定義的宏則完全不受任何外部因素影響,在整個編譯過程中都是常量。

常量 __STDC_VERSION__ 的值在未來新的 C 語言國際標準中會被調整。

從 C99 標準開始,C 程序或者在宿主環境(hosted)中執行,或者在獨立環境(freestanding)中執行。大多數 C 程序都在宿主環境中執行,也就是說,C 程序在操作系統的控制和支持之下執行。在這種情況下,常量 __STDC_HOSTED__ 的值是 1,且擁有完整的標準庫。

如果程序在獨立環境中執行,則沒有操作系統的支持,因此只需要最少的標準庫資源就可以使用。

在特定條件下被預定義的宏

與前面列舉的宏不同,下面的標準宏只有在特定的條件下才會被預定義。如果下面這些宏中有任何一個被定義,表示該實現版本支持某個 IEC 或 ISO 的標準:

(1) __STDC_IEC_559__

如果實現版本的浮點實數算術符合 IEC 60559 標準,則該常量值為 1。

(2) __STDC_IEC_559_COMPLEX__

如果實現版本的浮點復數算術符合 IEC 60559 標準,則該常量值為 1。

(3) __STDC_ISO_10646__

該長整數常量代表 yyyymmL 格式的一個日期(例如:199712L)。如果該常量值被定義,那么類型為 wchar_t 的寬字符編碼符合 ISO/IEC 10646 標準,且符合包含到該宏所定義日期為止所制訂的所有增補和修訂。

C11 標準添加了下面可選的宏:

(1) __STDC_MB_MIGHT_NEQ_WC__

如果一個在基本字符集中的字符,不強制要求它以 wchar_t 對象的編碼值等于它對應的字符常量,則該常量值為 1。

(2) __STDC_UTF_16__

如果類型 char16_t 以 UTF-16 方式編碼,則該常量值為 1。如果該類型使用其他編碼方式,則該宏未定義。

(3) __STDC_UTF_32__

如果類型 char32_t 以 UTF-32 方式編碼,則該常量值為 1。如果該類型使用其他編碼方式,則該宏未定義。

(4) __STDC_ANALYZABLE__

如果當前實現版本支持 C11 標準中附錄 L 中對運行錯誤的分析,則該常量值為 1。

(5) __STDC_LIB_EXT1__

如果當前實現版本支持 C11 標準中附錄 K 中關于邊界檢查的新函數,則該常量值為 201112L。這些新函數名稱均以 _s 結尾。

(6) __STDC_NO_ATOMICS__

如果當前實現版本沒有包括針對于原子內存訪問操作的類型與函數(不存在頭文件 stdatomic.h),則該常量值為 1。

(7) __STDC_NO_COMPLEX__

如果當前實現版本不支持復數算術運算(不存在頭文件 complex.h),則該常量值為 1。

(8) __STDC_NO_THREADS__

如果當前實現版本不支持多線程(不存在頭文件 threads.h),則該常量值為 1。

(9) __STDC_NO_VLA__

如果當前實現版本不支持可變長度數組,則該常量值為 1。

宏名稱 __cplusplus 專為 C++ 編譯器保留,因此,當編譯 C 源文件時,不可以定義名稱為 __cplusplus 的宏。

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo
极速pk10开户