Unix 宏在使用 -std=c++0x 标志编译时变得未定义

Unix macro becomes undefined when compiling with -std=c++0x flag

本文关键字:编译 标志 未定义 c++0x -std Unix      更新时间:2023-10-16

当使用-std=c++0x标志编译下面的代码时,unix 宏变得未定义,并显示错误">Unixis not defined!发生这种情况有什么原因以及如何解决它吗?在 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 特定于系统的预定义宏:

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__)