Unix 宏在使用 -std=c++0x 标志编译时变得未定义
Unix macro becomes undefined when compiling with -std=c++0x flag
当使用-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__
)
相关文章:
- 即使使用调试编译标志,表达式也是"optimized out"
- 在 CMake 中添加全局编译标志
- 如何在 clang 的自动会议中检查支持编译标志
- CMake:如何在Visual Studio环境中将依赖于模式的编译标志传递给nvcc
- CMake:替换接口目标的编译标志
- GCC - 包含编译标志的宏
- 覆盖单个文件的编译标志
- 通过宏定义编译标志(C++11 和优化)
- 如何强制 Netbeans 只使用 -ggdb 编译标志而不使用它,同时在 Makefile-Debug.mk 中自动发
- 覆盖来自 R 的C++编译标志的系统默认值
- 是否可以在编译时间作为宏上检测GCC编译标志
- 如何将编译标志 -g 添加到 make 文件
- "-Bdynamic"编译标志有什么作用?
- 如何在cpp文件(C++)中设置编译标志
- Qmake 不使用 stdc++11 编译标志
- 如何在 CMake 文件中添加链接器或编译标志
- CMake-删除单个翻译单元的编译标志
- 添加 -fPIC 编译标志后"Recompile with -fPIC"错误仍然存在
- 在不同的编译单元中使用不同的编译标志编译相同的头
- c++链接和编译标志