从预定义宏区分编译环境
除了C语言标准定义的特性和提供的供库,
区分编译器,就能确定能使用哪些编译器的扩展特性;
区分目标操作系统,就能确定哪些OS的API是可能用的;
C标准没有定义用来识别操作系统的宏,只能检测各个编译器自带的宏定义
要做跨平台编译,gcc跨Linux/Windows/Mac平台,所以这里只说gcc编译器下怎么区分操作系统
- 可以用以下命令行获取GCC定义的预编译宏:
$ < /dev/null gcc - -march=i386 -dM -E < /dev/null | sort (i386可替换为arm64等)
$ gcc -c -Q --help=target | grep -A2 -E 'valid.*march=' # 查看-march=后可用的参数
Windows和Linux/Cygwin/MSYS2的宏(gcc编译器下)
目标平台 | 宏 |
---|---|
windows | _WIN32, _WIN64 |
Linux | __linux__ |
MSYS2 | __MSYS__ |
Cygwin | __CYGWIN__ |
PS: _WIN32和 _Win64 在gcc和msvc中都可以用来区分windows;但 __WIN32 等只在 gcc中有效。
样板代码
区分操作系统
#ifdef _WIN32
//define something for Windows (32-bit and 64-bit, this part is common)
#