Gnu C++宏__cplusplus标准符合吗?

发布于 2024-12-06 16:32:48 字数 1020 浏览 1 评论 0原文

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

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

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

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

编译 C++ 翻译单元时,名称 __cplusplus 被定义为值 201103L。 (脚注:本标准的未来版本将用更大的值替换该宏的值。不符合标准的 com- 堆垛机应使用最多五位小数的值。)

旧的 std C++03 有类似的规则。

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

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

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

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

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

The Gnu C++ compiler seems to define __cplusplus to be 1

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

This prints 1 with gcc in standard c++ mode, as well as in C++0x mode, with gcc 4.3.4, and gcc 4.7.0.

The C++11 FDIS says in "16.8 Predefined macro names [cpp.predefined]" that

The name __cplusplus is defined to the value 201103L when compiling a C++ translation unit. (Footnote: It is intended that future versions of this standard will replace the value of this macro with a greater value. Non-conforming com-
pilers should use a value with at most five decimal digits.)

The old std C++03 had a similar rule.

Is the GCC deliberatly setting this to 1, because it is "non-conforming"?

By reading through that list I thought that I could use __cplusplus to check in a portable way if I have a C++11 enabled compiler. But with g++ this does not seem to work. I know about the ...EXPERIMENTAL... macro, but got curious why g++ is defining __cplusplus this way.

My original problem was switch between different null-pointer-variants. Something like this:

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

Is there a simple and reasonably portable way to implement such a switch?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

感情废物 2024-12-13 16:32:48

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

This was fixed about a month ago (for gcc 4.7.0). The bug report makes for an interesting read: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773

独自唱情﹋歌 2024-12-13 16:32:48

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

If I recall correctly this has to do with Solaris 8 causing issues when __cplusplus is set as it should. The gcc team decided at the time to support the Solaris 8 platform rather than be compliant in this particular clause. But I noticed that the latest version of gcc ends the Solaris 8 support, and I guess this is a first step in the right direction.

婴鹅 2024-12-13 16:32:48

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

也就是说,编译器不符合要求。

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

编辑:哦,我从 @birrryree 的评论中看到,该评论刚刚在 4.7.0 版本中修复。所以,最终修复也不是不可能。呵呵。

干杯&嗯。

It is a very old g++ bug.

That is, the compiler is not conforming.

Apparently it can't be fixed because fixing it would break something on a crazy platform.

EDIT: oh, I see from @birryree's comment that has just been fixed, in version 4.7.0. So, it was not impossible to fix after all. Heh.

Cheers & hth.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文