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

Neh*_*kar 11 c++ c++11

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

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

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

谢谢

NPE*_*NPE 22

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

#if __cplusplus < 201103L
#error This code requires C++11
#endif
Run Code Online (Sandbox Code Playgroud)

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

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

__cplusplus

__cplusplus201103L在编译C++转换单元时,名称定义为该值.(155)

(155)本标准的未来版本将以更大的值替换此宏的值.不合格的编译器应使用最多五位十进制数的值.


ale*_*der 9

__cplusplus宏可能会派上用场

#if __cplusplus < 201103L
#error C++11 Required
#endif
Run Code Online (Sandbox Code Playgroud)

像这样的东西

  • 示例结构有效,但我会检查少于C++ 11值. (2认同)

Mor*_*enn 5

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

如果您只需要特定的功能,那么我将使用Boost.Config检查它们,它定义了一整套宏,可用于检查编译器是否支持所需的功能.在您的情况下,您将需要:

  • BOOST_NO_CXX11_SCOPED_ENUMS 对于强类型的枚举.
  • BOOST_NO_CXX11_SMART_PTR对std::shared_ptr.