Вы можете распечатать только строку. Поэтому для печати PROJ
вам нужно будет превратить его в строку.
#define STRINGIZE(X) #X
#define STRINGIZE2(X) STRINGIZE(X)
STRINGIZE
применяет оператор stringizing на аргументе. Он превращает аргумент в строку, по существу, окружая его кавычками и, если необходимо, экранирует содержимое, чтобы создать допустимую строку. STRINGIZE2
используется, чтобы разрешить расширение аргумента препроцессором до того, как он превратится в строку. Это полезно, если вы хотите связать расширение макроса, а не самого макроса. Например, STRINGIZE2(__LINE__)
приведет к строке, которая представляет текущую строку в файле, например. "1723"
. Однако STRINGIZE(__LINE__)
приводит к строке "__LINE__"
.
Ваше определение PROJ
сталкивается с аналогичной проблемой. Это фактически приводит к токену ID_data..h
, а не proj1_data.h
. Вам потребуется уровень косвенного расширения, чтобы довести до конца соединение до ID
.
#define PASTE(X, Y) X ## Y
#define MKFILE(X) PASTE(X, _data.h)
#define PROJ STINGIZE2(MKFILE(ID))
Использование STRINGIZE2
позволяет MKFILE
призывание расширяться. Разрешение MKFILE
для вызова PASTE
позволяет токену ID
расширяться.
Конкатенация как строки не будет работать, если строки необходимы для '# include'. –
@JensGustedt: Должно быть исправлено сейчас. – jxh