2010-03-11 3 views
29

Можете ли вы сделать что-то подобное с макросом в C?C препроцессор Макроопределение макроса

#define SUPERMACRO(X,Y) #define X Y 

then 

SUPERMACRO(A,B) expands to #define A B 

У меня такое чувство не потому, что препроцессор проходит только один проход.

Официальный gcc только. Никаких сторонних инструментов, пожалуйста.

ответ

23

Макросы не могут быть расширены в директивы предварительной обработки. От C99 6.10.3.4/3 «Rescanning и дальнейшей замены»:

Результирующая полностью макро замененный предобработки лексем не обрабатывается как директива препроцессора, даже если он напоминает один,

2

Извините, вы не можете. Вы можете вызывать другие макросы в макросах, но не определять новые.

+0

как насчет того, если вы сделали 2 прохода предварительного процессора – pm100

+1

Синтаксис недействителен. # является видом зарезервированного символа в макросах. # должен следовать параметр макроса, который должен быть действительным. Это будет «подкручивать» параметр. –

3

No. Порядок операций таков, что все директивы препроцессора распознаются до того, как будет выполнено макроопределение; таким образом, если макрос расширяется во что-то, что выглядит как директива препроцессора, оно не будет распознаваться как таковое, но скорее будет интерпретироваться как (ошибочный) исходный текст C.

12

Вы не можете определить макросы в других макросах, но вы можете вызвать макрос из своего макроса, что может дать вам практически те же результаты.

#define B(x) do {printf("%d", (x)) }while(0) 
#define A(x) B(x) 

так, A(y) расширяется до do {printf("%d", (y)) }while(0)

0

Вы можете попробовать запустить его через только вариант Preprocess, то компиляции с препроцессором файла.

0

Вы могли бы сделать это, хотя: #define SUPERMACRO (X, Y) определяет X Y

Затем вы можете использовать функциональные редактор макрорасширения и вставить пропущенные #.

Или еще лучше: используйте другой, более мощный язык обработки строк в качестве вашего препроцессора.

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