Как избежать подчеркивания в токене препроцессора C?
-
02-07-2019 - |
Вопрос
Предполагается, что следующий фрагмент должен принимать значение PROJECT (определенное в Makefile) и создавать имя включаемого файла.Например, если PROJECT=classifier , то в конце он должен сгенерировать classifier_ir.h для PROJECTINCSTR
Я нахожу, что этот код работает до тех пор, пока я не пытаюсь использовать подчеркивание в суффиксе.Однако использование подчеркивания не является необязательным - наша кодовая база использует их повсюду.Я могу обойти это, потому что существует ограниченное количество значений для PROJECT, но я хотел бы знать, как заставить следующий фрагмент текста действительно работать с подчеркиванием.Можно ли этого избежать?
#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
Редактировать:Компилятор должен попытаться включить classifier_ir.h, а не PROJECT_ir.h .
Решение
#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)
Другие советы
Это работает для меня:
#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
Этот пример barebone работает с gcc (v4.1.2) и пытается включить "PROJECT_ir.h"