Предварительный процессор: Разверните макрос только один раз

#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)'