Это дополнительный вопрос к этому (а также ближе к актуальной проблеме).
Если у меня есть следующий случай:
#include <stdio.h>
#define FOO_ONE 12
#define FOO_TWO 34
#define BAR_ONE 56
#define BAR_TWO 78
#define FOO 99
#define STRINGIFY(mac) #mac
#define CONCAT(mac1, mac2) STRINGIFY(mac1) STRINGIFY(mac2)
#define MAKE_MAC(mac) CONCAT(mac##_ONE, mac##_TWO)
#define PRINT(mac) printf(#mac ": " MAKE_MAC(mac) "\n")
void main(int argc, char *argv[])
{
PRINT(FOO);
PRINT(BAR);
}
Как можно видеть, строковые, сцепленные макросы затем подставляются внутри оператора printf()
, который сам находится внутри макроса.
Поскольку FOO
определен (как 99
), это происходитчто он расширяется до объединения с _ONE
и _TWO
, эффективно создавая токены 99_ONE
и 99_TWO
.
Эта программа выводит:
FOO: 99_ONE99_TWO
BAR: 5678
Как я могуотложить расширение макроса FOO (фактически, полностью исключив его, чтобы получить требуемый результат:
FOO: 1234
BAR: 5678
ПРИМЕЧАНИЕ: предположим, что сигнатура макроса PRINT()
не может быть изменена (т. е. не может быть добавленапараметр и т. д.) Однако его реализация может быть изменена. Кроме того, определения FOO
, FOO_*
и BAR_*
также не могут быть изменены.