2008-09-26 5 views
1

L'extrait suivant est supposé prendre la valeur de PROJECT (définie dans le Makefile) et créer un nom de fichier d'inclusion. Par exemple, si PROJECT = classifier, alors il devrait à la fin générer classifier_ir.h pour PROJECTINCSTRComment faire pour échapper un trait de soulignement dans un jeton de préprocesseur C?

Je trouve que ce code fonctionne tant que je n'essaie pas d'utiliser un underscore dans le suffixe. Cependant, l'utilisation du trait de soulignement n'est pas facultative - notre base de code les utilise partout. Je peux contourner ce problème parce qu'il y a un nombre limité de valeurs pour PROJECT mais j'aimerais savoir comment faire fonctionner l'extrait suivant, avec le trait de soulignement. Peut-il être échappé?

#define PROJECT classifier 

#define QMAKESTR(x) #x 
#define MAKESTR(x) QMAKESTR(x) 
#define MAKEINC(x) x ## _ir.h 
#define PROJECTINC MAKEINC(PROJECT) 
#define PROJECTINCSTR MAKESTR(PROJECTINC) 

#include PROJECTINCSTR 

Edit: Le compilateur devrait essayer d'inclure classifier_ir.h, non PROJECT_ir.h.

+0

J'espère que les gars vous avez une bonne raison pour ce faire, parce que c'est complètement non-évident pour toute personne qui viendra plus tard. Vous utilisez une variable du Makefile, en exécutant une magie de folie, et ceci incluant un fichier nommé par la macro. Quelqu'un de nouveau n'aura aucune idée de ce qui se passe. –

+0

Nous sommes en train de trouver un équilibre entre le fait d'avoir à éditer à la main cette inclusion dans chaque projet qui utilise ce code, ou de le faire automagiquement faire la bonne chose. Il s'avère que ce truc de ruse n'est pas nécessaire, mais je suis toujours intéressé de comprendre pourquoi le code ne fonctionne pas. – amo

Répondre

7
#define QMAKESTR(x) #x 
#define MAKESTR(x) QMAKESTR(x) 
#define SMASH(x,y) x##y 
#define MAKEINC(x) SMASH(x,_ir.h) 
#define PROJECTINC MAKEINC(PROJECT) 
#define PROJECTINCSTR MAKESTR(PROJECTINC)
+0

Pouvez-vous expliquer pourquoi cela fonctionne et ce que j'ai essayé de faire ne fonctionne pas? – amo

+0

Fondamentalement, ce qui est accompli en introduisant la définition "SMASH", c'est que _ir.h va d'être des caractères aléatoires que le préprocesseur essaie de transformer en un "symbole" de macro. –

0

Cet exemple barebone travaille avec gcc (v4.1.2) et tente d'inclure "PROJECT_ir.h"

1

Cela fonctionne pour moi:

#define QMAKESTR(x) #x 
#define MAKESTR(x) QMAKESTR(x) 
#define MAKEINC(x) x ## _ir.h 
#define PROJECTINC(x) MAKEINC(x) 
#define PROJECTINCSTR MAKESTR(PROJECTINC(PROJECT)) 

#include PROJECTINCSTR 
Questions connexes