我正在维护一个旧编译器仍然支持的库,其中之一是 Windows 上的 Visual C++ 2013。到目前为止,我们一直非常保守并坚持使用 C++03;我们现在正在转向 C++11。VC++2013 支持大部分较新的特性,但它不识别noexcept.
当然,将它添加到代码中的规范方法是定义类似的东西
#if (the compiler does not support it)
#define NOEXCEPT
#else
#define NOEXCEPT noexcept
#endif
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它
void f() NOEXCEPT;
Run Code Online (Sandbox Code Playgroud)
当然,缺点是我们在代码周围散布了宏。
然而,我突然想到(可能是我肩膀上的一个小守护恶魔建议)我也可以写
#if (the compiler does not support it)
#define noexcept
#endif
Run Code Online (Sandbox Code Playgroud)
之后我可以写
void f() noexcept;
Run Code Online (Sandbox Code Playgroud)
并且该关键字将被较新的编译器正确使用并在较旧的编译器上定义。
这有效(就像它成功编译一样)但是,我感觉有点脏——我不确定我应该这样做。当然,定义关键字的标准是禁止定义的;但是如果编译器不完全支持标准,还是我处于某种灰色区域,它仍然如此吗?
由于它不是旧标准中的关键字,因此在针对旧标准时,您是,并且在技术上仍然允许定义此类宏。
PS pre-C++11 的典型定义是使用throw()代替noexcept.
PPS 请注意,在 的情况下noexcept,宏不适用于诸如
void foo() noexcept(false);
bool bar = noexcept(foo());
Run Code Online (Sandbox Code Playgroud)
因此,这些语句不能那么容易地向后兼容。鉴于无法支持 的所有用例noexcept,为宏使用不同的名称可能有助于避免混淆。