Почему assert определяется как (void) 0?

Зачем
#define assert(expression) ((void)0),
скорее, чем
#define assert(expression)
используется в режиме релиза? (строго говоря, когда определен NDEBUG)

Я слышал, что есть некоторые причины, но я забыл это.

4

Решение

((void)0) определяет assert(expression) ничего не делать.
Основная причина его использования заключается в том, что #define assert(expression) позволит assert(expression) компилировать без точки с запятой, но она не будет компилироваться, если макрос определен как ((void)0)

2

Другие решения

Причина по которой ((void)0) используется в empty macros это заставить их вести себя как функция, в том смысле, что вам нужно указать точку с запятой ; в конце

Например:

#define assert1(expression) (void)0
assert(1) // compile error, missing ;

#define assert2(expression)
assert(1) // works
1

По вопросам рекламы [email protected]