#if defined (x) || (y), est-ce valable?
Pendant un examen, je suis tombé sur un morceau de code suivant :
#if defined(x) || y
Que fait la déclaration ci-dessus signifie ? Sera la condition d'exécuter correctement ?
- Exécuter n'est pas le bon mot. Ce code est analysée au moment de la compilation. Je ne suis pas sûr de l'exactitude de la syntaxe, mais il pourrait tout au plus évaluée, mais généralement le droit de la syntaxe de "#if defined(x)" est "#IFDEF x"
Vous devez vous connecter pour publier un commentaire.
Oui, il est valide.
Ici est ce que la Norme (C99) dit dans 6.10p1:
la
defined
opérateur est considéré comme opérateur unaire partie d'une expression constante (6.10.1p1).Dans votre exemple, la condition est évaluée comme true si la macro
x
est défini OU siy
est définie et différente de0
Le raisonnement est double.
Au lieu d'utiliser un
#ifdef
, vous utilisez ledefined
de l'opérateur, de sorte que vous pouvez utiliser des opérateurs logiques sur elle (&&
,||
, etc.), de sorte que vous n'avez pas à reproduire votre code afin qu'il soit compris correctement si il y a plusieurs critères pour ce que vous devez défini.Aussi, à mon avis, je trouve ça beaucoup plus facile à lire que
#if defined(x)
que#ifdef x
, et vous pouvez faire ce qui suit#if defined(x) && defined(y)
, alors que ce n'est pas possible avec#ifdef
.Oui, depuis
defined(x)
est un booléen et renvoie true ou false.La déclaration ci-dessus signifie "x est défini, ou y est vrai".
c'est correct mais c'est une mauvaise pratique. Pourquoi utiliser deux différentes évaluations ('y' et 'défini(x)') dans une conditionnelle. Il pourrait être source de confusion pour les autres.
L'exemple ci-dessous montre l'utilisation plus fréquente de || et && operatiors contre #macros définies:
Lorsque le code ci-dessus a été exécuté à l'utilisateur de faire passer ces messages à l'écran:
Mais si le code était comme cela (AA était pas défini):
alors l'utilisateur recevra ce message: