“noexcept”关键字和“_NOEXCEPT”宏有什么区别?

3
我是一个C++的初学者,正在学习一些C++11特性。我注意到在Visual C++ stdlib的某些部分,作者使用了_NOEXCEPT宏而不是noexcept关键字。悬停在宏上会显示#define _NOEXCEPT noexcept,所以我有点困惑它的作用是什么。这两者之间有什么区别,我应该更喜欢哪一个呢?
编辑: 我刚在GitHub上搜索了一下,发现clang也使用了它,所以它不是一个特定于Visual C++的宏。

4
查看标准库实现是可以的,但不要将其作为编写自己代码的指南。 - Benjamin Lindley
如果您切换c++11支持,那么宏the是否会被定义为(deprecated) throw() - decltype_auto
2个回答

5

_NOEXCEPT不是标准的宏。前导下划线说明这属于实现范畴。

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

也就是说,它最初提供了一种编写代码的方式,可以与多个版本的编译器兼容。同样,人们可能会定义类似于CPPX_NORETURN的宏,使用特定于编译器的方法来指示无返回函数,在不支持C++属性[[noreturn]]的情况下。等等。


4

到处都是宏。定义宏的原因有很多。一个常见的原因是编写可以在不同的C或C ++编译器上进行最小更改的代码。

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

#define _NOEXCEPT noexcept

对于不支持 noexcept 的编译器,您可以简单地禁用 _NOECXEPT(即使可以使用条件宏自动完成此操作)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接