C 语言中的常见的预定义宏
__DATA__
此宏是编译器预定义的。表示当前的日期的一个字符串。
__FILE__
此宏是编译器预定义的。表示当前的源文件名的一个字符串。
__LINE__
此宏是编译器预定义的。表示当前的行号的的一个整数常量。
__TIME__
此宏是编译器预定义的。表示当前的时间(精确到秒)的一个字符串。
__FUNCTION__
此宏是编译器预定义的。表示当前函数的函数名。
__func__
此宏是编译器预定义的。表示当前函数的函数名( C99 标准才有 )。
__STDC_VERSION__
此宏是编译器预定义的。表示当前 C 语言标准的版本号的整数。
__cplusplus
此宏是 C++ 特有的,表示当前 C++ 语言标准的版本号的整数。C 语言编译器下绝对不会定义此宏。此宏可以用来区分当前源文件是 C 还是 C++。
__STDC_UTF_16__
如果该宏预定义为整数值1,则表示 char16_t 类型的值为 UTF-16 编码的字符。如果采用其他编码,则不会有此宏。
__STDC_UTF_32__
如果该宏预定义为整数值1,则表示 char32_t 类型的值为 UTF-32 编码的字符。如果采用其他编码,则不会有此宏。
__STDC_LIB_EXT1__
如果该宏被定义,则它是一个整数值 1,表示当前编译器实现了 C11 标准中安全版本的边界检查的函数集合,通常这些函数是以 _s
结尾的。否则该部分函数集合没有被实现。
__STDC_NO_VLA__
如果该宏被定义,则它是一个整数值 1,表示该编译器不支持变长数组( VLA )。
__STDC_NO_ATOMICS__
如果该宏被定义,则它是一个整数值 1,表示当前编译器不支持原子类型操作。(包括使用 _Atomic
限定符)
如果没有定义此宏,不要 #include <stdatomic.h>
__STDC_NO_COMPLEX__
如果该宏被定义,则它是一个整数值 1,表示当前编译器不支持复数类型。
如果没有定义此宏,不要 #include <complex.h>
__STDC_NO_THREADS__
如果该宏被定义,则它是一个整数值 1,表示当前编译器不支持 C 标准的线程库 (不是指 POSIX Thread),_Thread_local
关键字依然可以使用。
如果没有定义此宏,不要 #include <threads.h>
__GNUC__
GCC 编译器才有此宏,表示 GCC 的版本号。但是 clang 为了兼容 GCC,也会定义此宏。
_MSC_VER
VC 编译器才有此宏,表示 VC 的版本号。但是 Windows 下的 clang 为了兼容 VC,可能也会定义此宏。
__clang__
clang 编译器才有此宏,表示 clang 的版本号。
__BORLANDC__
Borland C/C++ 编译器才有此宏,表示 Borland C/C++ 的版本号。
_WIN32
生成目标为 Windows 系统的程序,都会定义此宏,不管是 32 位还是 64 位的,都会。
_WIN64
生成目标为 64位 Windows 系统的程序,会定义此宏,只有 64 位的 Windows,才会有定义此宏。
__APPLE__
生成目标为苹果操作系统的程序,会定义此宏,不管是电脑还是手机、平板设备。
__unix__
生成目标为 unix 及其兼容系统的程序。
__linux__
生成目标为 linux 及其兼容系统的程序。