Pourquoi la #if
condition du code suivant est-elle remplie:
#include <iostream>
#define VALUE foo
int main() {
#if VALUE == bar
std::cout << "WORKS!" << std::endl;
#endif // VALUE
}
c++
c-preprocessor
michalt38
la source
la source
Dans une
#if
instruction, tout identifiant qui reste après la substitution de macro (à l'exception detrue
etfalse
) est remplacé par la constante0
. Donc votre directive devientce qui est vrai.
la source
En effet, ni aucune définition ni valeur
foo
ne leurbar
ont été attribuées - elles sont donc identiques (c'est-à-dire remplacées par une valeur "0"). Les compilateurs donneront des avertissements à ce sujet.Le
MSVC
compilateur (Visual Studio 2019) donne ce qui suit:Ainsi,
VALUE
la valeur «0» est donnée (par défaut pourfoo
) et abar
également «0», donc estVALUE == bar
évalué à «VRAI».De même,
clang-cl
donne ce qui suit:la source
MSVC
etclang-cl
, cet avertissement peut être désactivé (soit spécifiquement, soit en définissant un «niveau» d'avertissement approprié).Pour accomplir ce que vous recherchez, essayez ceci:
Dans ce cas, vous pouvez désactiver les instructions de débogage en remplaçant "define" par "undef".
Vous pourriez trouver que votre compilateur vous permet de définir DEBUG en dehors du code lui-même, à quel point vous pouvez réduire le code à
Et puis appelez le compilateur avec une option telle que -DDEBUG = 0
Consultez le chapitre sur la programmation défensive dans Steve McConnell, «Code Complete».
la source