Препроцессор C Макроопределение макроса
Можете ли вы сделать что-то подобное с макросом в C?
#define SUPERMACRO(X,Y) #define X Y
then
SUPERMACRO(A,B) expands to #define A B
У меня есть чувство не потому, что препроцессор делает только один проход.
Только официальный gcc. Нет сторонних инструментов.
Ответы
Ответ 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)
Ответ 3
Существует метод, использующий #include, а не #define, который дает похожие результаты; см. мой ответ на этот похожий вопрос: определение макроса, содержащее директиву #include
Ответ 4
Нет. Порядок операций таков, что все директивы препроцессора распознаются до того, как будет выполнено макроопределение; таким образом, если макрос расширяется во что-то, что выглядит как директива препроцессора, оно не будет распознаваться как таковое, но скорее будет интерпретироваться как (ошибочный) исходный текст C.
Ответ 5
Извините, вы не можете. Вы можете вызывать другие макросы в макросах, но не определять новые.
Ответ 6
Вы можете попробовать запустить его только с опцией preprocess, а затем скомпилировать с предварительно обработанным файлом.
Ответ 7
Вы можете сделать это, хотя:
#define SUPERMACRO (X, Y) определить X Y
Затем вы можете использовать функции расширения макросов редакторов и вставить отсутствующие #.
Или даже лучше: используйте другой, более мощный язык обработки строк в качестве вашего препроцессора.