Следующий фрагмент должен принять значение 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.
Я надеюсь, что вы, ребята, есть хорошая причина для этого, потому что это совершенно неочевидно для всех, кто приходит позже. Вы используете переменную из Makefile, выполняя некоторые сумасшедшие макромагии, и это включает файл, названный макросом. Кто-то новый не будет знать, что происходит. – 2008-09-26 21:07:44
Мы добиваемся баланса между необходимостью редактировать вручную, это включать в каждый проект, который использует этот код, или автоматически его делать правильно. Оказывается, этот бит обмана не требуется, но мне все же интересно понять, почему код не работает. – amo 2008-09-26 21:17:57