Подтвердить что ты не робот

Препроцессор C Макроопределение макроса

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

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

then

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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