#c #c-preprocessor #preprocessor
Вопрос:
Можно ли развернуть макрос только один раз? В следующем примере MYCONCAT
расширяется до func_1(10)
. Я хочу, чтобы он расширился до func_BAR(10)
.
#define BAR 1 // included from a file I cannot change #define FOO BAR #define MYCONCAT2(c) func_ ## c #define MYCONCAT(c, x) MYCONCAT2(c)(x) MYCONCAT(FOO, 10) // is 'func_1(10)', but I want it to be 'func_BAR(10)'
Комментарии:
1. Ты можешь
#undef BAR
2. Это не значит , что вы хотите , чтобы макрос раскрывался только один раз; каждый макрос в примере раскрывается только один раз:
MYCONCAT
в текст сMYCONCAT2
,MYCONCAT2
доfunc_ ## c
,FOO
доBAR
иBAR
до1
. Вы хотите, чтобы сам процесс замены макросов был ограничен.3. Я чувствую, что нам нужно больше контекста здесь. Почему ПАНЕЛЬ определяется как 1, если вы не хотите, чтобы она расширялась таким образом? Какова конечная цель и вариант использования этого странного устройства?
4. Вы можете сделать это с помощью перечислений вместо
#define
констант.5. Можете ли вы включить файл, который определяет
BAR
после точки, в которой вы используетеMYCONCAT
, а не до нее?
Ответ №1:
Можно ли развернуть макрос только один раз?
Нет, частично развернуть макрос невозможно.
Ответ №2:
Включите файл, который определяет BAR
только после последнего места, где MYCONCAT
используется (с чем-то, что расширяется BAR
), а не до него.
Ответ №3:
Просто измените #define BAR
на #define _BAR
и и удалите _
из func
.
#define BAR 1 // included from a file I cannot change #define FOO _BAR #define MYCONCAT2(c) func ## c #define MYCONCAT(c, x) MYCONCAT2(c)(x) MYCONCAT(FOO, 10) // 'func_BAR(10)'