我是C++的初學者,我正在學習一些C++ 11的功能。我注意到的一件事是,在Visual C++ stdlib的某些部分,作者使用_NOEXCEPT
宏而不是noexcept
關鍵字。懸停在宏說#define _NOEXCEPT noexcept
,所以我有點困惑,它的重點是什麼。兩者之間有什麼區別,我應該更喜歡哪一個?noexcept關鍵字和_NOEXCEPT宏有什麼區別?
編輯:我只是尋找它在GitHub上,它看起來像clang使用它一樣,所以它不是一個Visual C++特定的宏。
我是C++的初學者,我正在學習一些C++ 11的功能。我注意到的一件事是,在Visual C++ stdlib的某些部分,作者使用_NOEXCEPT
宏而不是noexcept
關鍵字。懸停在宏說#define _NOEXCEPT noexcept
,所以我有點困惑,它的重點是什麼。兩者之間有什麼區別,我應該更喜歡哪一個?noexcept關鍵字和_NOEXCEPT宏有什麼區別?
編輯:我只是尋找它在GitHub上,它看起來像clang使用它一樣,所以它不是一個Visual C++特定的宏。
_NOEXCEPT
不是一個標準的宏。這是由領先的下劃線表示的,它表示這屬於實現。
很可能這個宏定義爲throw()
,直到Visual C++編譯器獲得對C++ 11中引入的noexcept
關鍵字的支持。
也就是說,它最初是作爲編寫與多個版本的編譯器兼容的代碼的手段提供的。以類似的方式,人們可以定義像CPPX_NORETURN
這樣的宏來使用編譯器特定的方式來指示不返回函數,其中不支持C++屬性[[noreturn]]
。等等。
無處不在的宏。定義宏有很多不同的原因。一個常見的原因是編寫的代碼可以在不同的C或C++編譯器上進行編譯,只需進行最少的更改。
例如,假設有一個代碼應該能夠在不支持noexcept
的編譯器中編譯。而不是寫兩個單獨的代碼,你可以使用關鍵字宏:
#define _NOEXCEPT noexcept
然後,編譯器不具有noexcept
你可以簡單地禁用_NOECXEPT
(即使它可以使用條件宏自動完成) 。
而且,歡迎到C/C++的世界......
看看你的標準庫實現是好的。不要將它用作如何編寫自己的代碼的指南。 –
如果你切換C++ 11的支持,宏是否被定義爲(不推薦)['throw()'](http://en.cppreference.com/w/cpp/language/except_spec)? –