我正在使用 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 年代编写代码时设计的,但现在已经显得过时了。目前我们有点陷入困境,因为我们还没有准备好迎接主要版本的更新。 (而且它并不像听起来那么糟糕初级筋膜因为它根据uncaught_exception http://en.cppreference.com/w/cpp/error/uncaught_exception).
我想通过检测 C++ 11 来修复该问题,然后添加noexcept(false) http://en.cppreference.com/w/cpp/language/noexcept。我打算将其隐藏在宏中,以便代码可以在 C++03 和 C++11 下编译。
下面的做法是not可以在 Visual Studio 2015 下检测 C++11。它不会产生预期的编译器错误:
#if (__cpluplus >= 201103L)
# error Not C++11
#endif
此外,微软还not似乎提供了预定义宏 https://msdn.microsoft.com/en-us/library/b0084kay.aspx用于检测语言特征。
如何在 Visual Studio 2015 下检测 C++11?
相关,我可以通过检测MSVC编译器的版本_MSC_VER https://msdn.microsoft.com/en-us/library/b0084kay.aspx. I think这将是_MSC_VER=1900
对于VS2015。但它没有告诉我任何有关语言特征的信息。
如果用户使用 VS2015,但使用较低级别的 C++ 标准,则语言功能非常重要。另外,我没有 VS2013 来测试,所以我不确定像这样的 1-off 字符串_MSC_VER=1700
是个好主意。我更愿意了解它是否是 C++11。
我在使用 Clang 和 GCC 编译器的 OS X 和 Linux 上遇到了类似的问题。例如,参见如何保护 C++03 和 C++11 的移动构造函数? https://stackoverflow.com/q/30797388/608639 and 在运行时可以检测到 C++03 和 C++11 之间的哪些差异(如果有)? https://stackoverflow.com/q/6473218但在这种情况下,我想通过预处理器检测它。
最后,这个库不使用 Autotools、Cmake 或 Boost。它没有外部依赖性。