11

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

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

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

谢谢

4

3 回答 3

22

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

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

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

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

__cplusplus

该名称__cplusplus201103L在编译 C++ 翻译单元时定义为值。(155)

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

于 2013-04-14T10:08:40.763 回答
9

__cplusplus宏可能会派上用场

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

像这样的东西

于 2013-04-14T10:07:51.257 回答
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_PTRstd::shared_ptr.
于 2013-04-14T13:34:38.717 回答