如何在MSVC下检测C ++ 11 for noexcept功能?

时间:2015-07-26 22:12:54

标签: c++ c++11 destructor visual-studio-2015 c-preprocessor

我正在使用C ++库。该库的最低要求是C ++ 03。我在Visual Studio 2015中捕获了关于抛出析构函数的警告:

... algparam.h(271): warning C4297: 'AlgorithmParametersBase::~AlgorithmParametersBase':
    function assumed not to throw an exception but does
... algparam.h(271): note: destructor or deallocator has
    a (possibly implicit) non-throwing exception specification

投掷是在20世纪90年代编写代码时设计的,但它现在显示了它的年龄。我们现在有点装箱,因为我们尚未准备好迎接重大版本的颠簸。 (并且它没有听起来那么糟糕 prima fascia 因为它基于uncaught_exception来保护投掷。)

我想通过检测C ++ 11,然后添加noexcept(false)来修复此问题。我打算将它隐藏在一个宏中,这样代码就可以在C ++ 03和C ++ 11下编译。

以下 可以在Visual Studio 2015下检测C ++ 11。它不会产生预期的编译错误:

#if (__cpluplus >= 201103L)
# error Not C++11
#endif

此外,Microsoft 似乎提供Predefined Macros来检测语言功能。

如何在Visual Studio 2015下检测C ++ 11?

相关,我可以通过_MSC_VER检测MSVC编译器的版本。我认为对于VS2015来说它将是_MSC_VER=1900。但它并没有告诉我任何语言特征。

如果用户登记VS2015,但语言功能很重要,但使用的是低级C ++标准。另外,我没有VS2013进行测试,因此我不确定像_MSC_VER=1700这样的1-off字符串是个好主意。我更愿意学习它的C ++ 11。

我在使用Clang和GCC编译器的OS X和Linux上遇到了类似的问题。例如,请参阅How to guard move constructors for C++03 and C++11?What differences, if any, between C++03 and C++11 can be detected at run-time?但在这种情况下,我想通过预处理器检测它。

最后,这个库不使用Autotools,Cmake或Boost。它没有外部依赖。

1 个答案:

答案 0 :(得分:6)

您无法独立于VS版本检测语言版本,因为VS不提供语言版本控制开关 - 不存在VS2015 C ++ 03模式。您尝试检测的条件(VS2015的下层标准)不存在,这可以轻松解释为什么没有功能宏来检测它。

只需检测VS版本并关闭它。