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