【问题标题】:GNU C++ how to check when -std=c++0x is in effect?GNU C++ 如何检查 -std=c++0x 何时生效?
【发布时间】:2023-03-09 18:42:01
【问题描述】:

我的系统编译器 (gcc42) 可以与我想要的 TR1 功能一起正常工作,但尝试支持系统以外的更新编译器版本,尝试访问 TR1 标头 #error 需要 -std=c++0x 选项,因为了解它如何与库或类似的一些集线器 bub 交互。

/usr/local/lib/gcc45/include/c++/bits/c++0x_warning.h:31:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.

必须提供一个额外的开关是没有问题的,在这个系统(FreeBSD)下支持 GCC 4.4 和 4.5,但显然它改变了画面!

使用我的系统编译器(g++ 4.2 默认方言):

#include <tr1/foo>
using std::tr1::foo;

使用带有 -std=c++0x 的较新 (4.5) 版本的编译器:

#include <foo>
using std::foo;

无论如何使用预处理器,我可以判断 g++ 是否在启用 C++0x 功能的情况下运行?

我正在寻找这样的东西

#ifdef __CXX0X_MODE__
#endif

但我没有在手册或网上找到任何内容。

按照这个速度,我开始认为生活会更轻松,将 Boost 用作依赖项,而不必担心新的语言标准会在 TR4 之前出现......呵呵。

【问题讨论】:

    标签: c++ gcc g++ c++11


    【解决方案1】:

    对于 gcc 4.4.4,似乎只有一个预定义的宏暗示 -std=c++0x 有效:

    #define __GXX_EXPERIMENTAL_CXX0X__ 1
    

    我无权访问 gcc 4.5.0,但您可以自己查看:

    [16:13:41 0 ~] $ g++ -E -dM -std=c++0x -x c++ /dev/null >b
    [16:13:44 0 ~] $ g++ -E -dM -std=c++98 -x c++ /dev/null >a
    [16:13:50 0 ~] $ diff -u a b
    --- a   2010-06-02 16:13:50.200787591 +0200
    +++ b   2010-06-02 16:13:44.456912378 +0200
    @@ -20,6 +20,7 @@
     #define __linux 1
     #define __DEC32_EPSILON__ 1E-6DF
     #define __unix 1
    +#define __GXX_EXPERIMENTAL_CXX0X__ 1
     #define __LDBL_MAX_EXP__ 16384
     #define __linux__ 1
     #define __SCHAR_MAX__ 127
    

    对于单行命令,

    g++ -E -dM -std=c++98 -x c++ /dev/null > std1 && g++ -E -dM -std=c++0x -x c++ /dev/null > std2 && diff -u std1 std2 | grep '[+|-]^*#define' && rm std1 std2
    

    给你类似的东西:

    +#define __GXX_EXPERIMENTAL_CXX0X__ 1
    

    【讨论】:

    • +1:“给男人一条鱼;你今天已经喂饱了他。教人钓鱼;你就不用听他不停地抱怨他有多饿了。” :)
    • 你可能不得不听-&gt;| |&lt;-是一英寸的鱼的故事。
    • 可以使用bash进程替换来避免使用std1std2:diff -u &lt;(g++ -E -dM -std=c++98 -x c++ /dev/null) &lt;(g++ -E -dM -std=c++0x -x c++ /dev/null)
    【解决方案2】:

    如果你用-std=c++0x编译,那么__GXX_EXPERIMENTAL_CXX0X__会被定义。

    【讨论】:

    • 在 GCC 添加新的 cplusplus 定义之前,最便携的选项是添加 '#if defined(__GXX_EXPERIMENTAL_CXX0X) || __cplusplus >= 201103L'
    • -std=c++11 和 GCC4.8.1 是一样的吗?
    【解决方案3】:

    嗯,从gcc-4.7 开始,您将能够检查 __cplusplus:

    “G++ 现在将预定义宏 __cplusplus 设置为正确的值,C++98/03 为 199711L,C++11 为 201103L”

    这应该是正确的、符合标准的方法。不幸的是,它不适用于大多数安装在野外的 gcc。

    【讨论】:

    • FWIW 这来自 C++11 16.8/1。
    • @LightnessRacesinOrbit 是的,你说得对,这个特性不是专门的 gcc,而是 C++ 标准。不幸的是,由于 gcc 目标之一的一些问题,即使对于 C++03/98,我们也无法明智地定义 __cplusplus。我认为目标最终被弃用了,我们可以继续前进。
    猜你喜欢
    • 1970-01-01
    • 2011-07-05
    • 2012-05-15
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    相关资源
    最近更新 更多