C препроцессор Macro, определяющий Macro - PullRequest
36 голосов
/ 12 марта 2010

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

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

then

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

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

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

Ответы [ 7 ]

30 голосов
/ 12 марта 2010

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

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

14 голосов
/ 27 мая 2010

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

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

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

4 голосов
/ 10 января 2015

Существует метод, использующий #include вместо #define, который дает аналогичные результаты; см. мой ответ на этот похожий вопрос: определение макроса, содержащее директиву #include

3 голосов
/ 12 марта 2010

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

2 голосов
/ 12 марта 2010

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

1 голос
/ 03 октября 2012

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

0 голосов
/ 21 февраля 2013

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

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

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

...