web-dev-qa-db-fra.com

Booléen dans ifdef: "#ifdef A && B" est-il identique à "#if défini (A) && défini (B)"?

En C++, c'est ceci:

#ifdef A && B

le même que:

#if defined(A) && defined(B)

?

Je pensais que ce n'était pas le cas, mais je n'ai pas trouvé de différence avec mon compilateur (VS2005).

75
criddell

Ils ne sont pas les mêmes. Le premier ne fonctionne pas (j'ai testé dans gcc 4.4.1). Le message d'erreur était:

test.cc:1:15: avertissement: jetons supplémentaires à fin de la directive #ifdef

Si vous voulez vérifier si plusieurs éléments sont définis, utilisez le second.

79
Evan Teran

Compilation conditionnelle

Vous pouvez utiliser l'opérateur défini dans la directive #if pour utiliser des expressions qui évaluent à 0 ou 1 dans un ligne de préprocesseur. Cela vous évite en utilisant des directives de prétraitement imbriquées . Les parenthèses autour de l'identifiant sont facultatifs. Par exemple:

#if defined (MAX) && ! defined (MIN)  

Sans utiliser l'opérateur défini, vous devriez inclure le suivant les deux directives à exécuter l'exemple ci-dessus:

#ifdef max 
#ifndef min
43
Svetlozar Angelov

Les résultats suivants sont les mêmes:

1.

#define A
#define B
#if(defined A && defined B)
printf("define test");
#endif

2.

#ifdef A
#ifdef B
printf("define test");
#endif
#endif
1
way good

Pour ceux qui recherchent par exemple (UNIX/g ++) un peu différent de l'OP, ceci peut aider:

`

#if(defined A && defined B && defined C)
    const string foo = "xyz";
#else
#if(defined A && defined B)
    const string foo = "xy";
#else
#if(defined A && defined C)
    const string foo = "xz";
#else
#ifdef A
    const string foo = "x";
#endif
#endif
#endif
#endif
0
MikeB