Зачем
#define assert(expression) ((void)0)
,
скорее, чем
#define assert(expression)
используется в режиме релиза? (строго говоря, когда определен NDEBUG)
Я слышал, что есть некоторые причины, но я забыл это.
((void)0)
определяет assert(expression)
ничего не делать.
Основная причина его использования заключается в том, что #define assert(expression)
позволит assert(expression)
компилировать без точки с запятой, но она не будет компилироваться, если макрос определен как ((void)0)
Причина по которой ((void)0)
используется в empty macros
это заставить их вести себя как функция, в том смысле, что вам нужно указать точку с запятой ;
в конце
Например:
#define assert1(expression) (void)0
assert(1) // compile error, missing ;
#define assert2(expression)
assert(1) // works