noexcept关键字和_NOEXCEPT宏之间有什么区别?

时间:2015-11-21 05:59:58

标签: c++ c++11 macros noexcept

我是C ++的初学者,我正在学习一些C ++ 11的功能。我注意到的一件事是,在Visual C ++ stdlib的某些部分中,作者使用_NOEXCEPT宏而不是noexcept关键字。悬停在宏上面说#define _NOEXCEPT noexcept,所以我有点困惑它的意义。两者之间有什么区别,我应该更喜欢一个吗?

编辑:我刚刚在GitHub上搜索它,看起来clang也使用它,所以它不是Visual C ++特定的宏。

2 个答案:

答案 0 :(得分:3)

到处都是宏。定义宏有许多不同的原因。一个常见的原因是编写可以在不同的C或C ++编译器上编译的代码,而且变化最小。

例如,假设有一个代码应该能够在不支持noexcept的编译器中编译。您可以将关键字用作宏:

,而不是编写两个单独的代码
#define _NOEXCEPT noexcept

然后,对于没有noexcept的编译器,您可以简单地禁用_NOECXEPT(即使它可以使用条件宏自动完成)。

欢迎来到C / C ++世界......

答案 1 :(得分:3)

_NOEXCEPT不是标准宏。由领先的下划线表示,这表示这属于实施。

很可能这个宏被定义为throw(),直到Visual C ++编译器获得对C ++ 11中引入的noexcept关键字的支持。

即,它最初是作为编写与多个版本的编译器兼容的代码的手段而提供的。类似地,可以定义像CPPX_NORETURN这样的宏来使用特定于编译器的方法来指示不返回函数,其中不支持C ++属性[[noreturn]]。等等。