2008-09-26 2 views
1

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

Я считаю, что этот код работает до тех пор, пока я не пытаюсь использовать подчеркивание в суффиксе. Однако использование подчеркивания не является дополнительным - наша база кода использует их везде. Я могу обойти это, потому что ограниченное количество значений для 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 

Edit: компилятор должен попытаться включить classifier_ir.h, не PROJECT_ir.h.

+0

Я надеюсь, что вы, ребята, есть хорошая причина для этого, потому что это совершенно неочевидно для всех, кто приходит позже. Вы используете переменную из Makefile, выполняя некоторые сумасшедшие макромагии, и это включает файл, названный макросом. Кто-то новый не будет знать, что происходит. – 2008-09-26 21:07:44

+0

Мы добиваемся баланса между необходимостью редактировать вручную, это включать в каждый проект, который использует этот код, или автоматически его делать правильно. Оказывается, этот бит обмана не требуется, но мне все же интересно понять, почему код не работает. – amo 2008-09-26 21:17:57

ответ

7
#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)
0

Этот пример Barebone работает с GCC (v4.1.2) и пытается включить "PROJECT_ir.h"

1

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

#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 
Смежные вопросы