預定義的巨集
預定義的巨集是 C 前處理器已經理解的巨集,而程式不需要定義它。例子包括
強制預定義巨集
__FILE__
,它給出當前原始檔的檔名(字串文字),__LINE__
為當前行號(整數常量),__DATE__
為編譯日期(字串文字),__TIME__
用於編譯時間(字串文字)。
還有一個相關的預定義識別符號 __func__
(ISO / IEC 9899:2011§6.4.2.2),它不是一個巨集:
識別符號
__func__
應由翻譯者隱式宣告,如同緊跟在每個函式定義的左大括號後面的宣告:static const char __func__[] = "function-name";
出現了,其中 function-name 是詞法封閉函式的名稱。
__FILE__
,__LINE__
和 __func__
對於除錯目的特別有用。例如:
fprintf(stderr, "%s: %s: %d: Denominator is 0", __FILE__, __func__, __LINE__);
C99 之前的編譯器,可能支援也可能不支援 __func__
,或者可能有一個巨集,其行為相同,名稱不同。例如,gcc 在 C89 模式下使用 __FUNCTION__
。
以下巨集允許詢問有關實現的詳細資訊:
__STDC_VERSION__
實施 C 標準的版本。這是一個使用格式yyyymmL
的常數整數(C11 的值為201112L
,C99 的值為199901L
; C89 / C90 的值未定義)__STDC_HOSTED__
1
如果它是託管實現,否則0
。__STDC__
如果1
,實現符合 C 標準。
其他預定義巨集(非強制性)
ISO / IEC 9899:2011§6.10.9.2 環境巨集:
__STDC_ISO_10646__
形式為yyyymmL
的整數常量(例如,199712L)。如果定義了此符號,則當儲存在wchar_t
型別的物件中時,Unicode 所需集中的每個字元都具有與該字元的短識別符號相同的值。Unicode 所需集包含 ISO / IEC 10646 定義的所有字元,以及指定年份和月份的所有修訂和技術勘誤。如果使用某些其他編碼,則不應定義巨集,並且使用的實際編碼是實現定義的。
__STDC_MB_MIGHT_NEQ_WC__
整數常量 1,用於表示在wchar_t
的編碼中,當用作整數字符常量中的單個字元時,基本字符集的成員不需要具有等於其值的程式碼值。
__STDC_UTF_16__
整數常量 1,用於表示char16_t
型別的值為 UTF-16 編碼。如果使用某些其他編碼,則不應定義巨集,並且使用的實際編碼是實現定義的。
__STDC_UTF_32__
整數常量 1,用於表示char32_t
型別的值是 UTF-32 編碼的。如果使用某些其他編碼,則不應定義巨集,並且使用的實際編碼是實現定義的。
ISO / IEC 9899:2011§6.10.8.3 條件特徵巨集
__STDC_ANALYZABLE__
整數常數 1,用於表示符合附錄 L(可分析性)中的規範。__STDC_IEC_559__
整數常數 1,用於表示符合附錄 F(IEC 60559 浮點運算)中的規範。__STDC_IEC_559_COMPLEX__
整數常數 1,用於表示符合附錄 G(IEC 60559 相容複雜算術)中的規範。__STDC_LIB_EXT1__
整數常量201112L
,用於表示支援附錄 K(Bounds-checking interfaces)中定義的擴充套件。__STDC_NO_ATOMICS__
整數常量 1,用於表示實現不支援原子型別(包括_Atomic
型別限定符)和<stdatomic.h>
頭。__STDC_NO_COMPLEX__
整數常量 1,用於表示實現不支援複雜型別或<complex.h>
頭。__STDC_NO_THREADS__
整數常量 1,用於表示實現不支援<threads.h>
頭。__STDC_NO_VLA__
整數常量 1,用於指示實現不支援可變長度陣列或可變修改型別。