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

jww*_*jww 4 c++ destructor c-preprocessor c++11 visual-studio-2015

我正在使用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
Run Code Online (Sandbox Code Playgroud)

投掷是在20世纪90年代编写代码时设计的,但它现在显示了它的年龄.我们现在有点装箱,因为我们尚未准备好迎接重大版本的颠簸.(而且它不是那么糟糕,因为它听起来初步筋膜,因为它扼守基于扔uncaught_exception).

我想通过检测C++ 11然后添加来修复该问题noexcept(false).我打算在宏中隐藏它,所以代码将在C++ 03和C++ 11下编译.

以下内容无法在Visual Studio 2015下检测C++ 11.它不会产生预期的编译器错误:

#if (__cpluplus >= 201103L)
# error Not C++11
#endif
Run Code Online (Sandbox Code Playgroud)

此外,Microsoft似乎没有提供用于检测语言功能的预定义宏.

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


相关,我可以通过检测MSVC编译器的版本_MSC_VER.我认为这将是_MSC_VER=1900VS2015.但它并没有告诉我有关语言功能的任何信息.

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


我在使用Clang和GCC编译器的OS X和Linux上遇到了类似的问题.例如,参见如何为C++ 03和C++ 11保护移动构造函数?什么区别,如果有的话,C++ 03和C++ 11之间可以在运行时被检测到?但在这种情况下,我想通过预处理器检测它.


最后,该库不使用Autotools,Cmake或Boost.它没有外部依赖.

Pup*_*ppy 6

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

只需检测VS版本并关闭它即可.

  • @jww:有一个微软的功能矩阵......某处.但它并不是非常可靠,因为很多广告功能都太麻烦,不太可靠.但是,我可以明确地告诉您,2015年之前的版本不支持noexcept. (3认同)