В чем разница между ключевым словом noexcept и макросом NOEXCEPT?
Я новичок в C++ и изучаю некоторые функции C++11. Я заметил, что в некоторых частях Visual C++ stdlib авторы использовали макрос _NOEXCEPT
вместо ключевого слова noexcept
. Наведение указателя мыши на макрос говорит #define _NOEXCEPT noexcept
, поэтому я немного смущен, в чем его смысл. В чем разница между ними, и должен ли я предпочесть одно другому?
EDIT: я только что искал его на GitHub, и похоже, что clang также использует его, так что это не специфичный для Visual C++ макрос.
2 ответа:
Скорее всего, этот макрос был определен как
_NOEXCEPT
это не стандартный макрос. На это указывает ведущее подчеркивание, которое говорит, что это относится к реализации.throw()
, пока компилятор Visual C++ не получил поддержку ключевого словаnoexcept
, введенного в C++11. То есть, что он изначально был предусмотрен как средство для написания кода, который был бы совместим с несколькими версиями компилятора. В аналогичном ключе можно было бы определить макрос, подобныйCPPX_NORETURN
, чтобы использовать специфичный для компилятора означает указать функцию без возврата, где атрибут C++[[noreturn]]
не поддерживается. И так далее.
Макросы повсюду. Существует много различных причин для определения макросов. Распространенной причиной является написание кода, который может быть скомпилирован на разных компиляторах C или C++ с минимальными изменениями.
Например, предположим, что существует код, который должен быть способен компилироваться в компиляторе, не поддерживающемnoexcept
. Вместо того чтобы писать два отдельных кода, Вы можете использовать ключевое слово в качестве макроса:#define _NOEXCEPT noexcept
Тогда для компиляторов, у которых нет
noexcept
, вы можете просто отключить_NOECXEPT
(даже если это может быть выполняется автоматически с помощью условных макросов).И, добро пожаловать в мир C / C++...