使用-std = c ++ 0x标志进行编译时,Unix宏变为未定义

kor*_*ish 0 c++ gcc

使用-std = c ++ 0x标志编译下面的代码时,unix宏变为未定义且错误"Unix未定义!" 显示.是否有任何理由发生这种情况以及如何解决这个问题?在gcc版本4.7.2和4.8.4中验证.

#include <iostream>

#if !defined(unix)
#error Unix is not defined!
#endif

int main()
{
    std::cout << "Hello World!" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Dev*_*lar 10

从GCC手册,3.7.3系统特定的预定义宏:

C标准要求所有特定于系统的宏都是保留命名空间的一部分.所有以两个下划线或下划线和大写字母开头的名称都保留给编译器和库以供其使用.但是,历史上系统特定的宏具有没有特殊前缀的名称; 例如,unix在Unix系统上找到定义是很常见的.对于所有这些宏,GCC提供了一个并行宏,在开头和结尾添加了两个下划线.如果unix已定义,__unix__也将定义.永远不会超过两个下划线; 平行的_mips__mips__.

当向编译器提供-ansi选项或-std请求严格一致性的任何选项时,将禁止保留命名空间之外的所有系统特定的预定义宏.保留命名空间内的并行宏仍然是定义的.

特别注意第二段.


TL;博士

unix宏不符合标准,__unix__是.当您询问编译器时-std=c++0x,它切换到"严格一致",只有__unix__可用(并且默认支持的"扩展" unix被删除).