Comment échapper à un trait de soulignement dans un jeton de préprocesseur C?

StackOverflow https://stackoverflow.com/questions/141878

  •  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.

Était-ce utile?

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"

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top