2016-03-31 9 views
4

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

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

+5

Существует, как правило ',' после этого, и если утверждает, не стало ничего, что одиноким остальным ';' может вызвать предупреждение. –

+0

Последний разрешит 'assert (true)' (без точки с запятой), тогда как первый не будет. –

+3

@MarcGlisse вы должны разместить его в качестве ответа. На данный момент ваш комментарий является единственным утверждением, которое фактически отвечает на вопрос плаката. – axiac

ответ

2

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

+0

И в чем разница с '#define assert (expr)'? – RedX

1

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

Например:

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

#define assert2(expression) 
    assert(1) // works 
Смежные вопросы