Que fait “#define assert (exp) ((void) 0)”?

Je suis tombé sur cette définition du préprocesseur lors de la lecture du code source dans Windows Research Kernel (WRK) 1.2:

#define assert(exp) ((void) 0) 

Que fait ce code? Pourquoi est-ce défini?

    Il définit l’expression affirmer ( n’importe quoi ) pour ne rien faire.

    Vraisemblablement, l’environnement utilisé ne prend pas en charge l’instruction d’assertion ANSI C ou le programmeur ignorait qu’il pouvait être désactivé en définissant NDEBUG.

    Pour développer ce que dit bdonlan , la raison pour laquelle la macro ne se développe pas vide est parce que si c’est le cas, quelque chose comme:

     assert(something) // oops, missed the semi-colon assert(another_thing); 

    comstackrait en mode publication mais pas en mode débogage. La raison pour laquelle il s’agit ((void) 0) plutôt que simplement 0 est d’empêcher les avertissements “instruction sans effet” (ou peu importe que MSVC les appelle).

    Ajoutons simplement que c’est la définition d’ assert dans newlib également, lorsque NDEBUG est défini en tant que directive de préprocesseur. Newlib est la bibliothèque C open source utilisée sur Cygwin et les systèmes intégrés.

    Du manuel d’ assert dans newlib :

    La macro est définie pour vous permettre de désactiver toutes les utilisations d’ assert lors de la compilation en définissant NDEBUG tant que variable de préprocesseur. Si vous faites cela, la macro assert se développe en (void(0))