¿Cómo escapar de un guión bajo en un token de preprocesador C?
-
02-07-2019 - |
Pregunta
Se supone que el siguiente fragmento de código toma el valor de PROYECTO (definido en el Makefile) y crear un nombre de archivo de inclusión. Por ejemplo, si PROJECT = classifier, al final debería generar classifier_ir.h para PROJECTINCSTR
Encuentro que este código funciona siempre y cuando no esté tratando de usar un guión bajo en el sufijo. Sin embargo, el uso del guión bajo no es opcional, nuestra base de código los usa en todas partes. Puedo solucionar esto porque hay un número limitado de valores para PROYECTO, pero me gustaría saber cómo hacer que el siguiente fragmento de código realmente funcione, con el subrayado. ¿Se puede escapar?
#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
Editar: el compilador debe intentar incluir classifier_ir.h, no PROJECT_ir.h.
Solución
#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)
Otros consejos
Esto funciona para mí:
#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
Ese ejemplo de barebone funciona con gcc (v4.1.2) e intenta incluir " PROJECT_ir.h "