如何断言C ++ 11应该用于编译我的程序?

时间:2013-04-14 10:06:03

标签: c++ c++11

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

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

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

谢谢

3 个答案:

答案 0 :(得分:22)

您可以检查__cplusplus宏的值是201103L还是更高:

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

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

  

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

     

__cplusplus

     

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

     

(155)本标准的未来版本旨在用更大的值替换此宏的值。不合格   编译器应使用最多五位数的值。

答案 1 :(得分:9)

__cplusplus宏可能会派上用场

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

像这样的东西

答案 2 :(得分:5)

正如已经说过的那样,正确的解决方案是检查__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定义{{3}},可以用来检查您的编译器是否支持所需的功能。在您的情况下,您需要:

  • BOOST_NO_CXX11_SCOPED_ENUMS用于强类型枚举。
  • BOOST_NO_CXX11_SMART_PTR代表std::shared_ptr