我是C ++的初学者,我正在学习一些C ++ 11的功能。我注意到的一件事是,在Visual C ++ stdlib的某些部分中,作者使用_NOEXCEPT
宏而不是noexcept
关键字。悬停在宏上面说#define _NOEXCEPT noexcept
,所以我有点困惑它的意义。两者之间有什么区别,我应该更喜欢一个吗?
编辑:我刚刚在GitHub上搜索它,看起来clang也使用它,所以它不是Visual C ++特定的宏。
答案 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]]
。等等。