2014-03-10 3 views
0
#define ID proj1 

#define PROJ ID##_data.h 

В соответствии с моим требованиями определения PROJ должна иметь proj1_data.hконкатенация два определения

При печати PROJ Это должно дать proj1_data.h,

Пожалуйста, помогите мне, чтобы получить желаемый результат. Заранее спасибо !

ответ

2

Вы можете распечатать только строку. Поэтому для печати 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 расширяться.

+0

Конкатенация как строки не будет работать, если строки необходимы для '# include'. –

+0

@JensGustedt: Должно быть исправлено сейчас. – jxh

Смежные вопросы