2015-11-21 98 views
3

我是C++的初學者,我正在學習一些C++ 11的功能。我注意到的一件事是,在Visual C++ stdlib的某些部分,作者使用_NOEXCEPT宏而不是noexcept關鍵字。懸停在宏說#define _NOEXCEPT noexcept,所以我有點困惑,它的重點是什麼。兩者之間有什麼區別,我應該更喜歡哪一個?noexcept關鍵字和_NOEXCEPT宏有什麼區別?


編輯:我只是尋找它在GitHub上,它看起來像clang使用它一樣,所以它不是一個Visual C++特定的宏。

+3

看看你的標準庫實現是好的。不要將它用作如何編寫自己的代碼的指南。 –

+0

如果你切換C++ 11的支持,宏是否被定義爲(不推薦)['throw()'](http://en.cppreference.com/w/cpp/language/except_spec)? –

回答

3

_NOEXCEPT不是一個標準的宏。這是由領先的下劃線表示的,它表示這屬於實現。

很可能這個宏定義爲throw(),直到Visual C++編譯器獲得對C++ 11中引入的noexcept關鍵字的支持。

也就是說,它最初是作爲編寫與多個版本的編譯器兼容的代碼的手段提供的。以類似的方式,人們可以定義像CPPX_NORETURN這樣的宏來使用編譯器特定的方式來指示不返回函數,其中不支持C++屬性[[noreturn]]。等等。

3

無處不在的宏。定義宏有很多不同的原因。一個常見的原因是編寫的代碼可以在不同的C或C++編譯器上進行編譯,只需進行最少的更改。

例如,假設有一個代碼應該能夠在不支持noexcept的編譯器中編譯。而不是寫兩個單獨的代碼,你可以使用關鍵字宏:

#define _NOEXCEPT noexcept 

然後,編譯器不具有noexcept你可以簡單地禁用_NOECXEPT(即使它可以使用條件宏自動完成) 。

而且,歡迎到C/C++的世界......

相關問題