首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"unix“C++预处理器宏未用-std=c++11定义

"unix“C++预处理器宏未用-std=c++11定义
EN

Stack Overflow用户
提问于 2019-08-01 08:34:36
回答 2查看 629关注 0票数 5

unixpreproc.cpp

代码语言:javascript
复制
#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编译器手册中记录

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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__.

票数 7
EN

Stack Overflow用户

发布于 2019-08-01 08:51:25

我认为这是故意的,是的。根据C++11标准(以及其他正式发布的C++标准),符合标准的编译器不能声明他们想要的任何宏和其他全局符号,因为它们可能会干扰程序对这些名称的使用。在标准保留名称的特定列表(不包括unix)之外,编译器必须使用以双下划线开头的宏名称,这些名称保留给编译器使用。

当您不指定任何语言标准时,编译器将遵循其默认行为,这将避免严格的标准遵从性,而有利于向后兼容性。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57304931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档