2010-11-26 57 views
5

Je dois écrire du code pour vérifier qu'une macro est définie mais vide (sans valeur). Le test n'a pas besoin d'être à la compilation.Test si la valeur d'une macro C est vide

Je cherche à écrire:

#if (funcprototype == "") 
MY_WARN("funcprototype is empty"); 
#endif 

le code ne compile pas, comme funcprototype à vide étend.

+0

Le test n'a pas besoin d'être un test de compilation, mais vous souhaitez utiliser le résultat dans une directive '# if '? Que se passe-t-il si 'funcprototype' a une liste de remplacement non-vide, mais après le remplacement, il se transforme en rien (en raison de la nouvelle analyse). –

+0

Cela semble être un doublon de http://stackoverflow.com/questions/4102351/test-for-empty-macro-definition –

Répondre

5

Si un contrôle d'exécution est correct, vous pouvez tester la longueur du remplacement stringized:

#define REAL_STRINGIZE(x) #x 
#define STRINGIZE(x) REAL_STRINGIZE(x) 

if (STRINGIZE(funcprototype)[0] == '\0') { 
    // funcprototype expanded to an empty replacement list 
} 
else { 
    // funcprototype expanded to a non-empty replacement list 
} 

Je ne pense pas qu'il y ait un cas général « est cette macro remplacé par un vide séquence de jetons "vérification à la compilation. C'est un problème similaire à «est-il possible de comparer deux séquences de jetons pour l'égalité», ce qui est impossible à faire à la compilation.

+1

cela dépend de ce que l'on peut supposer de la séquence de jetons. voir par exemple [cette stupide macro] (http://alfps.wordpress.com/2010/05/06/cppx-a-simple-unit-tests-framework/) du mien. ** hark ** (anticipant une question évidente) bien qu'il a été fait pour un but très spécial –

+1

Pour que cela fonctionne dans Visual Studio, le 'STRINGIZE (x)' doit être défini comme '# x' sinon la substitution à' REAL_STRINGIZE 'la macro échoue si' x' est une macro vide (se terminera par une erreur "pas assez d'arguments"). Y a-t-il une raison pour laquelle la macro est dans deux niveaux comme celui-ci? Je l'ai déjà vu mais je n'ai pas lu de bonnes explications sur la raison de cette situation? –

+0

Nevermind, trouvé ma réponse ici: http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan. Laissant ici pour quelqu'un qui pourrait le trouver utile. –