2010-11-01 4 views
1

У меня есть код, который использует enum вместо указателя функции для обратных вызовов. Обратный вызов вызывается с использованием таблицы: callback_table[enum].Переименовать переменную в препроцессоре C

Перечисления называются с номером enum_ prefix, и соответствующая функция имеет имя func_ prefix.

Таким образом, вызовы функций с участием обратных вызовов выглядит следующим образом:

foo (param, enum_name); 

При просмотре кода я должен взять на себя имя части и префикс func_ вместо просто делает «Перейти к определению».

Я хотел бы иметь макрос так, что мой код выглядит следующим образом:

foo (param, f2e(func_name)); 

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

Возможно ли иметь такой макрос? Простейшим решением было бы исключить func_, что означает, что f2e просто присоединяет enum_ prefix, но я предпочел бы решение, в котором у меня все еще может быть func_. Это возможно?

ответ

1

Это немного окольным, но вы могли бы сделать что-то вроде этого:

(давайте предположим, ради этого примера, что у вас есть три возможных значения перечислений enum_one, enum_two и enum_three).

#define enum_func_one enum_one 
#define enum_func_two enum_two 
#define enum_func_three enum_three 

#define f2e(func_name) enum_ ## func_name 

недостаток (конечно) является то, что вам нужно специальное #define для каждого возможного значения вашего перечисления.


Alternative

В качестве альтернативы, если только потребность иметь имя функции под рукой, так что вы можете использовать функцию вашего IDE, «перейти к определению» ... вы могли бы сделать что-то вроде это:

#define f2e(name, func_name) enum_ ## name 

, то ваш звонок будет выглядеть следующим образом:

foo (param, f2e(one, func_one)); 

может быть немного избыточным, но это выполнит вашу задачу с минимальным вторжением в остальную часть вашего кода.

Смежные вопросы