Он определяет выражение 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))