【问题标题】:Gnu C++ macro __cplusplus standard conform?Gnu C++ 宏 __cplusplus 是否符合标准?
【发布时间】:2011-11-23 17:00:48
【问题描述】:

Gnu C++ 编译器似乎将__cplusplus 定义为1

#include <iostream> 
int main() {
  std::cout << __cplusplus << std::endl;
}

这会在标准 c++ 模式下使用 gcc 打印 1,以及在 C++0x 模式下使用 gcc 4.3.4 和 gcc 4.7.0。

C++11 FDIS 在“16.8 预定义宏名称 [cpp.predefined]”中说

在编译 C++ 翻译单元时,名称 __cplusplus 被定义为 值 201103L。 (脚注:这个标准的未来版本打算用一个更大的值替换这个宏的值。不合格的 com- 堆垛机应使用最多五个十进制数字的值。)

旧的标准 C++03 也有类似的规则。

GCC 是否故意将其设置为 1,因为它“不合格”

通过阅读该列表,我认为如果我有启用 C++11 的编译器,我可以使用 __cplusplus 以可移植的方式检查。但是对于 g++,这似乎不起作用。我知道 ...EXPERIMENTAL... 宏,但很好奇为什么 g++ 以这种方式定义 __cplusplus

我最初的问题是在不同的空指针变体之间切换。像这样的:

#if __cplusplus > 201100L
#  define MYNULL nullptr
#else
#  define MYNULL NULL
#endif

是否有一种简单且可移植的方式来实现这样的开关?

【问题讨论】:

  • 旁注:我还没有完全阅读这个线程,但这被认为是 g++ 中的一个错误(10 年前!)并在 4.7.0 中修复:gcc.gnu.org/bugzilla/show_bug.cgi?id=1773
  • 怎么样#ifndef nullptr #define nullptr NULL #endif#ifdef nullptr #define MYNULL nullptr #else #define MYNULL NULL #endif

标签: c++ gcc c++11 standards-compliance c++-standard-library


【解决方案1】:

大约一个月前已修复此问题(适用于 gcc 4.7.0)。错误报告读起来很有趣:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773

【讨论】:

  • 哇,我上周更新了我的 svn 树,但没有在 that 编译器上运行测试代码。等等……是的,你是对的!上周的 gcc-4.7.0:./define-cplusplus.x 199711
  • 这个漏洞已经存在 10 多年了...确实很有趣。
【解决方案2】:

如果我没记错的话,这与 Solaris 8 有关,当__cplusplus 设置为应有的设置时会导致问题。 gcc 团队当时决定支持 Solaris 8 平台,而不是遵守此特定条款。但我注意到最新版本的 gcc 结束了对 Solaris 8 的支持,我想这是朝着正确方向迈出的第一步。

【讨论】:

    【解决方案3】:

    这是一个非常古老的 g++ 错误。

    即编译器不符合。

    显然它无法修复,因为修复它会破坏疯狂平台上的某些东西。

    编辑:哦,我从@birryree 的评论中看到刚刚在 4.7.0 版中修复。所以,毕竟修复也不是不可能。呵呵。

    干杯&hth。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 2012-10-28
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      相关资源
      最近更新 更多