C/C++ 宏区分不同系统、编译器、语言版本
区分不同系统
1)_WIN32
,Windows系统
_WIN64:32bit and 64bit系统
M_WIN64:仅64bit Windows系统
M_WIN32:仅32bit Windows系统
_WINDOWS:GUI Application
_CONSOLE:console Application
2)__APPLE__
,苹果系统,包括MAC、IOS
TARGET_IPHONE_SIMULATOR:IOS模拟器
TARGET_OS_IPHONE:IOS设备
TARGET_OS_MAC:MAC系统
3)__ANDRIOD__
,安卓系统
4)__linux__
,linux系统
5)__unix__
,所有unix系统
6)_POSIX_VERSION
,符合POSIX标准的系统
其他标准还有__FreeBSD__等.
区分不同编译器及其版本
1)MSVC
:Microsoft Visual C++编译器
_MSC_VER:不同版本的MSVC编译器,对应不同的Visual Studio版本,如1928对应Visual Studio 2019
2)__GNUC__
:GNU gcc编译器;
__GNUG__
:GNU g++编译器
__GNUC__
、__GNUC_MINOR__
、__GNUC_PATCHLEVEL__
:gcc主版本号、次版本号、修正版本号
__GNUC_PATCHLEVEL__
是gcc 3.0以后才有
Linux下命令行输入$gcc -version
,可确认gcc版本号。
Linux发行版gcc编译器通常写作GNU GCC
3)__clang__
:clang编译器
__clang_major__
、__clang_minor__
:clang主、次版本号
LLVM是编译器的工具链集合,Clang是使用LLVM的编译器。
4)__MINGW32__
:MinGW编译器
MinGW是Windows上gcc的一个实现,基于Win32 API构建,Unix/Linux程序很可能不能直接编译运行;
Cygwin是提供类Unix环境(cygwin1.dll),模拟POSIX API接口在Windows上运行,Unix/Linux程序可不修改或少量修改即可编译运行。
5)__CYGWIN__
:Cygwin编译器
__CYGWIN32__
:32bit版本Cygwin
6)__BORLANDC__
:Borland C++编译器
区分不同语言及其版本
1)__cplusplus
:区分C与C++代码
gcc编译.c文件,没定义__cplusplus,编译器按C编译代码;
gcc编译.cpp文件,定义了__cplusplus,编译器按C++编译代码;
g++编译.c文件,定义了 __cplusplus,编译器按C++编译代码;
g++编译.cpp文件,定义了 __cplusplus,编译器按C++编译代码;
如果当前文件已定义了__cplusplus(由编译器定义),说明编译环境为C++,则需要用extern "C"{...}
包裹C代码,告诉编译器按C编译这部分代码。
tips:MSVC也支持__cplusplus
2)__cplusplus
:确定当前支持的C++语言标准的版本
如__cplusplus常用值:199711L = C++98,201103L = C++11,201402L = C++14,201703L = C++17
参考
https://blog.csdn.net/goodcrony/article/details/104985620
https://blog.csdn.net/adminstate/article/details/130247630
https://zhuanlan.zhihu.com/p/78693248