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