2014-04-27 2 views
3

Je veux définir la macro, que sur la base d'une condition (existence de #define INITED, pas le paramètre de la macro) renvoie la valeur, ou de générer l'erreur de compilateur, comme:#erreur interne de #define - Possible en C++ (génère une erreur lors de l'appel de la macro MyMacro SI une constante n'est pas définie)?

#error Not initialized! 

J'ai essayé (pour myIdea.h):

#ifdef INITED 
    #define MyMacro(x) x->method(); //something with x 
#else 
    #define MyMacro(x) #error Not initalized! 
#endif 

Mais ce code génère une erreur (pas celle que je voulais) expected macro format parameter.

Notez que je ne veux pas que le code (travail, mais cela chose peu différent):

#ifdef INITED 
    #define MyMacro(x) x->method(); //something with x 
#else 
    #error Not initalized! 
#endif 

Le code ci-dessus geneate erreur juste au moment où INITED ne sera pas défini. Je veux générer l'erreur seulement quand j'appelle au MyMacro() ET INITED n'a pas encore été défini.

Je ne suis pas l'esclave au premier code, mais je veux que le résultat fonctionne exactement comme je l'ai décrit ci-dessus (Générer une erreur lors de l'appel macro MaMacro IF constante inited n'est pas défini) .

+1

Je suis assez certain que ce n'est pas possible. Cela nécessiterait plusieurs passages à travers le code par le préprocesseur, et je suis assez sûr qu'il ne le fait pas. –

Répondre

4

Ceci n'est pas possible. Le préprocesseur est juste une chose très simple, il n'analyse pas les macros imbriquées comme ça. Le deuxième livre (#) ne serait pas compris comme une macro imbriquée par le préprocesseur. L'argument est à peu près géré comme une chaîne brute.

Vous pouvez cependant vous intéresser à l'assertion statique avec C++ 11 et au lieu de votre directive #error. Vous écrivez alors quelque chose comme ceci:

#ifdef INITED 
    #define MyMacro(x) x->method(); //something with x 
#else 
    #define MyMacro(x) static_assert(false, "Not initalized!"); 
#endif 
+0

Je vois. Mais y a-t-il un moyen de réaliser ce que je veux d'une autre manière? Je ne sais pas exactement ce que vous entendez par "pré-traitement en deux étapes". – PolGraphic

+1

@PolGraphic: utilisez l'assertion statique. – lpapp

Questions connexes