Подтвердить что ты не робот

Что означает "#define assert (exp) ((void) 0)" делать?

Я столкнулся с этим определением препроцессора при чтении исходного кода в Ядро исследования Windows (WRK) 1.2:

#define assert(exp) ((void) 0)

Что делает этот код? Почему это определено?

4b9b3361

Ответ 1

Он определяет выражение assert (ничего), чтобы ничего не делать.

Предположительно, используемая среда не поддерживает утверждение ANSI C assert, или программист не знал о том, что он может быть отключен определяя NDEBUG.

Ответ 2

Чтобы расширить то, что говорит bdonlan, причина, по которой макрос не распространяется пустым, заключается в том, что если бы это произошло, то что-то вроде:

assert(something) // oops, missed the semi-colon
assert(another_thing);

будет компилироваться в режиме деблокирования, но не в режиме отладки. Причина, по которой это ((void) 0), а не только 0, заключается в предотвращении предупреждений "без каких-либо последствий" (или каких-либо других сообщений, вызываемых MSVC).

Ответ 3

Просто для добавления, это определение assert в newlib тоже, когда NDEBUG определяется как директива препроцессора. Newlib - это библиотека с открытым кодом C, которая используется на Cygwin и встроенные системы.

В руководстве пользователя newlib:

Макрос определен, чтобы вы могли отключить все применения assert в время компиляции, определяя NDEBUG как переменную препроцессора. Если вы это сделаете, макрос assert расширяется до (void(0))