发布于 ,更新于 

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 及其兼容系统的程序。