使用-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;
}
从GCC手册,3.7.3 System-specific Predefined Macros:
C标准要求所有特定于系统的宏都是保留命名空间的一部分。所有以两个下划线或下划线和大写字母开头的名称都保留给编译器和库以供其使用。但是,历史上系统特定的宏具有没有特殊前缀的名称;例如,在Unix系统上定义
unix
是很常见的。对于所有这些宏,GCC提供了一个并行宏,在开头和结尾添加了两个下划线。如果定义了unix
,那么也将定义__unix__
。永远不会超过两个下划线;_mips
的平行线是__mips__
。当
-ansi
选项或任何请求严格一致性的-std
选项被赋予编译器时,保留命名空间之外的所有系统特定的预定义宏都将被抑制。保留命名空间内的并行宏仍然是定义的。
特别注意第二段。
tl;博士
unix
宏不符合标准,__unix__
是。当您向编译器询问-std=c++0x
时,它切换到“严格一致性”,其中只有__unix__
可用(并且默认支持的“扩展”unix
被删除)。
正如其他人所说'unix'是标准的gcc扩展,并且通过指定--std=c++0x
,你告诉它使用标准。您可以改为执行--std=gnu++0x
并保留扩展名(或者使用其他人建议的__unix__
)