unixpreproc.cpp
#ifdef unix
#warning "unix is defined"
#endif
#ifdef __unix__
#warning "__unix__ is defined"
#endif
void main() {}使用Intel C++编译器19.0.3:
icpc -o unixpreproc unixpreproc.cpp显示unix和__unix__宏都是定义的。
但
icpc -std=c++11 -o unixpreproc unixpreproc.cpp显示只定义了__unix__。这是故意的吗?是未在Intel编译器手册中记录。
发布于 2019-08-01 08:55:10
是的,这是故意的。GCC手册(在这方面的行为与icpc相同)解释了这一点:
C标准要求所有特定于系统的宏都是保留名称空间的一部分。所有以两个下划线或下划线和大写字母开头的名称都保留给编译器和库使用。然而,历史上特定于系统的宏都有没有特殊前缀的名称;例如,在Unix系统上找到定义的
unix是很常见的。对于所有这些宏,GCC提供了一个并行宏,在开头和结尾添加了两个下划线。如果定义了unix,那么__unix__也将被定义。永远不会有两个以上的下划线;_mips的并行是__mips__。 当-ansi选项或请求严格一致性的任何-std选项被赋予编译器时,保留命名空间之外的所有特定于系统的预定义宏都会被抑制。保留名称空间中的并行宏仍然是定义的。
请参阅https://gcc.gnu.org/onlinedocs/cpp/System-specific-Predefined-Macros.html
-std=c++11选项请求严格的一致性。-std=gnu++11选项是非严格等价的,它将定义unix和__unix__.
发布于 2019-08-01 08:51:25
我认为这是故意的,是的。根据C++11标准(以及其他正式发布的C++标准),符合标准的编译器不能声明他们想要的任何宏和其他全局符号,因为它们可能会干扰程序对这些名称的使用。在标准保留名称的特定列表(不包括unix)之外,编译器必须使用以双下划线开头的宏名称,这些名称保留给编译器使用。
当您不指定任何语言标准时,编译器将遵循其默认行为,这将避免严格的标准遵从性,而有利于向后兼容性。
https://stackoverflow.com/questions/57304931
复制相似问题