预定义的宏

预定义的宏是 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,用于指示实现不支持可变长度数组或可变修改类型。