В чем разница между ключевым словом noexcept и макросом NOEXCEPT?


Я новичок в C++ и изучаю некоторые функции C++11. Я заметил, что в некоторых частях Visual C++ stdlib авторы использовали макрос _NOEXCEPT вместо ключевого слова noexcept. Наведение указателя мыши на макрос говорит #define _NOEXCEPT noexcept, поэтому я немного смущен, в чем его смысл. В чем разница между ними, и должен ли я предпочесть одно другому?


EDIT: я только что искал его на GitHub, и похоже, что clang также использует его, так что это не специфичный для Visual C++ макрос.

2 3

2 ответа:

_NOEXCEPT это не стандартный макрос. На это указывает ведущее подчеркивание, которое говорит, что это относится к реализации.

Скорее всего, этот макрос был определен как throw(), пока компилятор Visual C++ не получил поддержку ключевого слова noexcept, введенного в C++11. То есть, что он изначально был предусмотрен как средство для написания кода, который был бы совместим с несколькими версиями компилятора. В аналогичном ключе можно было бы определить макрос, подобный CPPX_NORETURN, чтобы использовать специфичный для компилятора означает указать функцию без возврата, где атрибут C++ [[noreturn]] не поддерживается. И так далее.

Макросы повсюду. Существует много различных причин для определения макросов. Распространенной причиной является написание кода, который может быть скомпилирован на разных компиляторах C или C++ с минимальными изменениями.

Например, предположим, что существует код, который должен быть способен компилироваться в компиляторе, не поддерживающем noexcept. Вместо того чтобы писать два отдельных кода, Вы можете использовать ключевое слово в качестве макроса:
#define _NOEXCEPT noexcept

Тогда для компиляторов, у которых нет noexcept , вы можете просто отключить _NOECXEPT (даже если это может быть выполняется автоматически с помощью условных макросов).

И, добро пожаловать в мир C / C++...