2016-03-31 3 views
4

Pourquoi #define assert(expression) ((void)0), plutôt que #define assert(expression) est utilisé en mode de sortie? (À proprement parler, quand NDEBUG)Pourquoi assert est défini comme (void) 0?

J'ai entendu qu'il ya des raisons, mais je l'ai oublié.

+5

Il y a habituellement un ',' plus tard, et si rien ne assert est devenu, que seul reste ';' pourrait déclencher un avertissement. –

+0

Ce dernier autoriserait 'assert (true)' (sans point-virgule), alors que le premier ne le ferait pas. –

+3

@ MarcGlisse vous devriez le poster comme une réponse. Pour l'instant, votre commentaire est la seule déclaration qui répond réellement à la question de l'affiche. – axiac

Répondre

2

((void)0) définit assert(expression) pour ne rien faire.
La principale raison de l'utiliser est que #define assert(expression) permettrait assert(expression) de compiler sans virgule, mais il ne compilera pas si la macro est définie comme ((void)0)

+0

Et quelle est la différence avec '#define assert (expr)'? – RedX

1

La raison pour laquelle ((void)0) est utilisé dans empty macros est de faire se comporter comme une fonction , dans le sens où vous devez spécifier le point-virgule ; à la fin

Par exemple:

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

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