使用-std=c++0x编译时unix宏未定义的原因及解决方法
这个问题我之前在维护老代码的时候碰到过,在GCC 4.x版本切换到C++11标准模式时确实会出现这类情况,我来给你详细说下原因和解决办法:
问题原因
当你使用-std=c++0x(这是C11标准的早期编译标识)编译代码时,GCC会进入**严格符合C标准**的模式。在这个模式下,GCC会禁用一系列非标准的预定义宏,包括unix这类和平台强相关的传统宏——因为这些宏并不属于C++标准的一部分,为了保证代码的标准兼容性,默认就不再定义它们了。
而在默认的编译模式(也就是不指定-std参数时,GCC用的是gnu++98这类GNU扩展模式)下,这些平台相关的宏是会被自动定义的,所以之前的代码能正常编译。
修复方案
这里给你几个不同场景下的解决办法,你可以根据需求选择:
1. 保留GNU扩展特性(最快的临时修复)
如果你只是想让原有代码继续正常工作,不想修改代码,可以把编译选项从-std=c++0x换成-std=gnu++0x。这个选项会启用C++11的特性,同时保留GNU的扩展(包括unix这类平台宏),完全兼容原有代码的判断逻辑。
编译命令示例:
g++ -std=gnu++0x your_code.cpp -o your_program
2. 手动定义unix宏
如果必须使用严格的-std=c++0x模式,可以在编译时手动通过-D参数定义unix宏:
g++ -std=c++0x -Dunix your_code.cpp -o your_program
3. 改用标准/稳定的平台检测方式(推荐长期方案)
从代码健壮性和可移植性考虑,建议替换掉非标准的unix宏,改用GCC支持的、更稳定的预定义宏,比如__unix__(双下划线开头结尾,这是编译器认可的平台检测宏),或者针对Linux系统用__linux__。
修改后的代码示例:
#include <iostream> #if !defined(__unix__) #error Unix-like system is not defined! #endif int main() { std::cout << "Hello World!" << std::endl; return 0; }
另外,如果你需要更通用的POSIX系统检测,可以检查<unistd.h>中定义的_POSIX_VERSION宏,这是POSIX标准规定的,兼容性更好:
#include <iostream> #include <unistd.h> #if !defined(_POSIX_VERSION) #error POSIX-compliant system is required! #endif int main() { std::cout << "Hello World!" << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者korish

