je suis tombé sur cette définition de préprocesseur en lisant le code source dans Windows Research Kernel (WRK) 1.2:Qu'est-ce que "#define assert (exp) ((void) 0)" fait?
#define assert(exp) ((void) 0)
Que fait ce code? Pourquoi est-ce défini?
je suis tombé sur cette définition de préprocesseur en lisant le code source dans Windows Research Kernel (WRK) 1.2:Qu'est-ce que "#define assert (exp) ((void) 0)" fait?
#define assert(exp) ((void) 0)
Que fait ce code? Pourquoi est-ce défini?
Il définit l'expression assert (quoi que ce soit) pour ne rien faire.
Vraisemblablement, l'environnement utilisé ne prend pas en charge l'instruction ANSI C assert, ou le programmeur ignorait qu'il pouvait être désactivé en définissant NDEBUG.
Ou le code était dans assert.h –
Pour développer ce bdonlan dit, la raison pour laquelle la macro ne se dilate pas vide est parce que si elle l'a fait, alors quelque chose comme:
assert(something) // oops, missed the semi-colon
assert(another_thing);
serait compiler en mode de sortie mais pas en mode de débogage. La raison pour laquelle c'est ((void) 0)
plutôt que simplement 0
est d'empêcher les avertissements "sans déclaration" (ou tout ce que MSVC les appelle).
Juste pour ajouter, c'est la définition de assert dans newlib aussi, quand NDEBUG
est défini comme une directive préprocesseur. Newlib est la bibliothèque C open source utilisée sur les systèmes embarqués Cygwin.
De l'assert manuel newlib:
La macro est définie pour vous permettre de désactiver toutes les utilisations de assert à compilation en définissant
NDEBUG
comme une variable de préprocesseur. Si vous faites cela, le assert macro se développe pour(void(0))
Juste curieux - ce qui est WRK 1.2? –
Ma conjecture: Windows Research Kernel 1.2 –
Oui, c'est Windows Research Kernel 1.2 – Porco