預定義的巨集

預定義的巨集是 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,用於指示實現不支援可變長度陣列或可變修改型別。