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

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

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

2 ответа

((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
Другие вопросы по тегам