Что делает "#define assert (exp) ((void) 0)"? - PullRequest
10 голосов
/ 20 мая 2009

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

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

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

Ответы [ 3 ]

16 голосов
/ 20 мая 2009

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

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

8 голосов
/ 20 мая 2009

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

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

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

0 голосов
/ 08 сентября 2009

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

Из руководства assert в newlib :

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

...