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

问题描述 投票:0回答:2

使用-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;
}
c++ gcc
2个回答
10
投票

从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被删除)。


3
投票

正如其他人所说'unix'是标准的gcc扩展,并且通过指定--std=c++0x,你告诉它使用标准。您可以改为执行--std=gnu++0x并保留扩展名(或者使用其他人建议的__unix__

© www.soinside.com 2019 - 2024. All rights reserved.