Чтобы расширить то, что говорит bdonlan , причина, по которой макрос не раскрывается пустым, заключается в том, что если он это сделал, то что-то вроде:
assert(something) // oops, missed the semi-colon
assert(another_thing);
будет компилироваться в режиме выпуска, но не в режиме отладки. Причина в том, что это ((void) 0)
, а не просто 0
, состоит в том, чтобы предотвратить предупреждения "оператор без эффекта" (или как их называет MSVC).