Comment échapper à un trait de soulignement dans un jeton de préprocesseur C?
-
02-07-2019 - |
Question
L'extrait suivant est supposé prendre la valeur de PROJECT (définie dans le Makefile) et créez un nom de fichier à inclure. Par exemple, si PROJECT = classifieur, il devrait générer à la fin classifier_ir.h pour PROJECTINCSTR
.Je trouve que ce code fonctionne tant que je n'essaie pas d'utiliser un trait de soulignement 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 car le nombre de valeurs de PROJECT est limité, 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
Éditer: le compilateur devrait essayer d’inclure classifier_ir.h, pas PROJECT_ir.h.
La solution
#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)
Autres conseils
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
Cet exemple barebone fonctionne avec gcc (v4.1.2) et tente d'inclure "PROJECT_ir.h"
.