【问题标题】:How to assert that C++11 should be used to compile my program?如何断言应该使用 C++11 来编译我的程序?
【发布时间】:2013-04-14 10:06:03
【问题描述】:

我想在我的程序中使用一些 C++11 功能。将来我可能不得不与其他人分享我的源代码。 如何在代码中断言应该使用 C++11 来编译我的程序? 较旧的编译器可能会抛出错误,但我希望清楚地告知用户 C++ 11 是必需的。

如果重要的话,我正在使用以下 C++11 功能:

  • 指定存储大小的枚举
  • std 共享指针

谢谢

【问题讨论】:

  • static_assert(true);。 (我在开玩笑。不要这样做。)
  • 请注意,在撰写本文时,没有完全支持 C++11 的编译器。因此,如果您测试完整的 C++11 支持,您将有很多误报 - 具有您需要的功能但未实现 C++11 的编译器因此被您的测试拒绝。跨度>
  • @SteveJessop 我的印象是,根据this table,GCC 已经支持所有 C++11 功能。如果我错了,请纠正我。
  • @Malcolm 大部分都支持,但有些细节可以完善,libstdc++ 不完全兼容C++11。
  • @Malcolm:gcc.gnu.org/onlinedocs/libstdc++/manual/…。进步很大,但仍有一些重大遗漏。

标签: c++ c++11


【解决方案1】:

您可以检查__cplusplus 宏的值是否为201103L 或更大:

#if __cplusplus < 201103L
#error This code requires C++11
#endif

C++11 16.8 预定义的宏名称:

以下宏名称应由实现定义:

__cplusplus

在编译 C++ 翻译单元时,名称 __cplusplus 被定义为值 201103L。 (155)

(155) 本标准的未来版本打算将此宏的值替换为更大的值。不合格 编译器应该使用最多五个十进制数字的值。

【讨论】:

  • 我应该使用#if _cplusplus == 201103L {my code} #elif {display error} 之类的吗?
  • @NehaKaranjkar:不要比较是否相等。我已经用一个例子更新了答案。
  • 我刚刚了解了#error 指令。谢谢。对提到这一点的两个答案都 +1。
  • __cplusplus 在 Windows 上已损坏,请参阅 stackoverflow.com/questions/14131454/…
  • 同样,所有不支持 export 的 C++98 编译器都不应该将其设置为 199711L,尽管有些编译器这样做了。 __cplusplus 宏的值存在一个实际问题,即它并非旨在帮助区分不符合 C++98 的编译器和不符合 C+ 的编译器+11 ;-)
【解决方案2】:

__cplusplus 宏可能会派上用场

#if __cplusplus < 201103L
#error C++11 Required
#endif

像这样的

【讨论】:

  • 示例结构有效,但我会检查小于 C++11 的值。
  • @rhalbersma:我同意你的观察的技术性,但我真的不认为很快会再次批准。 C++03 ---> C++11,8 年 ha..
  • 它将有更大的日期,并有望向后兼容 c++11
  • @AlokSave,最后我听说,C++14 进展顺利。大约一年前,人们决定他们会努力推动 C++ 更快地向前发展。
  • @chris yes Bjarne Stroustrup 似乎已经过时了常见问题解答。
【解决方案3】:

正如已经说过的,正确的解决方案是检查__cplusplus 宏。但是,某些编译器部分支持 C++11 功能,但未将此宏设置为正确的值。例如,自 GCC 4.4.0 起,g++ 中就提供了强类型枚举。但是,使用选项 -std=c++11(及其等效项),宏 __cplusplus 在 GCC 4.7.0 之前没有设置为合适的值(而是设置为 1)。这意味着某些编译器可以编译您的代码,但如果您以这种方式检查 C++11,则不会。

如果您只需要特定功能,那么我会使用 Boost.Config 检查它们,它定义了 a whole set of macros,可用于检查您的编译器是否支持所需的功能。在您的情况下,您需要:

  • BOOST_NO_CXX11_SCOPED_ENUMS 用于强类型枚举。
  • BOOST_NO_CXX11_SMART_PTRstd::shared_ptr

【讨论】:

    猜你喜欢
    • 2022-06-14
    • 2018-08-25
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多