Ce dont il est question est &&
et ||
opérateurs pour l' #if
#if defined (AAA) || defined (BBB)
Si defined (AAA)
est défini, defined (BBB)
n'est jamais évaluée.
Mise à JOUR
Il faut donc lancer le calcul va être court-circuitée. Par exemple, si vous créez avec -Wundef
à mettre en garde sur l'utilisation de l'indéfini des macros.
#if defined FOO && FOO > 1000
#endif
#if FOO > 1000
#endif
entraînera
thomas:~ jeffery$ gcc foo.c -Wundef
foo.c:4:5: warning: 'FOO' is not defined, evaluates to 0 [-Wundef]
#if FOO > 1000
^
1 warning generated.
Donc, la première version ne génère pas mal défini d'avertissement de macro, car FOO > 1000
n'est pas évalué.
VIEILLES RÊVERIES
Cela devient important si la deuxième partie est une macro qui a des effets secondaires. La macro ne serait pas évalué, de sorte que les effets secondaires n'aurait pas lieu.
Pour éviter macro abus je vais vous donner un peu sane exemple
#define FOO
#define IF_WARN(x) _Pragma (#x) 1
#if defined(FOO) || IF_WARN(GCC warning "FOO not defined")
#endif
Maintenant que j'ai construit cet exemple, j'ai un problème. IF_WARN
est toujours évalué.
hein, plus de recherche est nécessaire.
Bien foo... maintenant que je l'ai lu à nouveau.
Les Macros. Toutes les macros dans l'expression sont développées avant le calcul de la valeur de l'expression commence.