Переименовать переменную в препроцессоре C - PullRequest
1 голос
/ 01 ноября 2010

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

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

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

foo (param, enum_name);

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

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

foo (param, f2e(func_name));

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

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

1 Ответ

1 голос
/ 01 ноября 2010

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

(предположим, для примера, что у вас есть три возможных значения enum 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));

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

...