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