预定义宏是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__或者可能具有行为相同但名称不同的宏。例如,__FUNCTION__在C89模式下使用的gcc 。
下面的宏允许询问有关实现的详细信息:
__STDC_VERSION__已实现的C标准版本。这是使用格式的恒定整数yyyymmL(201112LC11的值199901L,C99的值;尚未为C89 / C90定义)
__STDC_HOSTED__ 1如果是托管实现,则为else 0。
__STDC__如果为1,则实现符合C标准。
ISO / IEC 9899:2011§6.10.9.2环境宏:
__STDC_ISO_10646__形式的整数常量yyyymmL(例如199712L)。如果定义了此符号,则Unicode必需集中的每个字符存储在type类型的对象中时wchar_t,其值与该字符的短标识符相同。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(边界检查接口)中定义的扩展。
__STDC_NO_ATOMICS__整数常量1,用于指示实现不支持原子类型(包括_Atomic类型限定符)和<stdatomic.h>标头。
__STDC_NO_COMPLEX__整数常量1,用于指示实现不支持复杂类型或<complex.h>标头。
__STDC_NO_THREADS__整数常量1,用于指示该实现不支持<threads.h>标头。
__STDC_NO_VLA__整数常量1,用于指示该实现不支持可变长度数组或可变修改的类型。