44 votes

Comment tester si un symbole préprocesseur est #define'd mais n'a pas de valeur ?

En utilisant les directives du préprocesseur C++, est-il possible de tester si un symbole du préprocesseur a été défini mais n'a pas de valeur ? Quelque chose comme ça :

#define MYVARIABLE
#if !defined(MYVARIABLE) || #MYVARIABLE == ""
... blablabla ...
#endif

EDIT : La raison pour laquelle je le fais est que le projet sur lequel je travaille est censé prendre une chaîne de l'environnement par le biais de /DMYSTR=$(MYENVSTR) et cette chaîne peut être vide. Je veux m'assurer que le projet ne compile pas si l'utilisateur a oublié de définir cette chaîne.

3voto

harper Points 5962

Vous ne pouvez pas puisque le préprocesseur ne peut vérifier qu'une valeur numérique. Votre comparaison de chaînes de caractères n'est pas couverte par la syntaxe du préprocesseur.

2voto

Reinderien Points 4529

Je ne pense pas que cela puisse être fait. Cela dit, je n'en vois pas l'utilité. Lorsque vous faites un préprocesseur #define vous devez établir une convention selon laquelle soit vous le définissez comme 1 ou 0 pour une utilisation dans #if ou vous laissez le champ vide.

2voto

Mehrdad Points 70493

Pour les macros à base de nombres entiers uniquement...

Vous pouvez utiliser un hack sans macros supplémentaires :

#if ~(~MYVARIABLE + 0) == 0 && ~(~MYVARIABLE + 1) == 1
/* MYVARIBLE is undefined here */
#endif

0voto

Kris Morness Points 384

#if MYVARIABLE==0 Ma réponse doit comporter au moins 30 caractères, ce qui devrait suffire !

0voto

Alex Points 109

Dans le même ordre d'idées, nous voulons souvent vérifier si une macro est indéfini c'est zéro ou a une valeur entière autre que zéro :

#if ! defined(MYVARIABLE)
  // UNDEFINED:  MYVARIABLE is undefined
#elif ~ MYVARIABLE + 1
  // TRUE:       MYVARIABLE is defined and is empty or nonzero integer
#else
  // FALSE:      MYVARIABLE is defined and is zero
#endif

Comment cela fonctionne-t-il ?

  • si MYVARIABLE est vide, alors ~ + 1 évalue à non zéro (vrai)
  • si MYVARIABLE est non nulle (par exemple 1 ) alors ~ 1 + 1 évalue à non zéro (vrai)
  • si MYVARIABLE est égal à zéro, alors ~ 0 + 1 évalue à zéro (faux)

Cette méthode fonctionne pour toute valeur entière pour MYVARIABLE . Quand MYVARIABLE est le nom d'une autre macro, la valeur de cette macro sera utilisée, comme on peut s'y attendre.

Notez que si vous voulez simplement vérifier si MYVARIABLE comme un drapeau de compilation est activé (défini et vide ou non nul) :

#if defined(MYVARIABLE) && ~ MYVARIABLE + 1
  // the MYVARIABLE feature is enabled
#endif

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X