Как избежать подчеркивания в токене препроцессора C? - PullRequest
1 голос
/ 27 сентября 2008

Следующий фрагмент должен принимать значение PROJECT (определено в Makefile) и создайте имя включаемого файла. Например, если PROJECT = классификатор, то в конце он должен сгенерировать classifier_ir.h для PROJECTINCSTR

Я считаю, что этот код работает до тех пор, пока я не пытаюсь использовать подчеркивание в суффиксе. Однако использование подчеркивания не является обязательным - наша кодовая база использует их повсюду. Я могу обойти это, потому что есть ограниченное количество значений для ПРОЕКТА, но я хотел бы знать, как заставить следующий фрагмент на самом деле работать с подчеркиванием. Можно ли избежать?

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

Ответы [ 3 ]

7 голосов
/ 27 сентября 2008
#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)
1 голос
/ 27 сентября 2008

Это работает для меня:

#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
0 голосов
/ 27 сентября 2008

Этот пример barebone работает с gcc (v4.1.2) и пытается включить «PROJECT_ir.h»

...