在C预处理器中重命名变量

时间:2010-11-01 19:45:10

标签: c macros c-preprocessor

我有一些现有代码使用enum而不是函数指针进行回调。使用表格调用回调:callback_table[enum]

枚举以enum_ prefix命名,相应的函数以func_ prefix命名。

因此,涉及回调的函数调用如下所示:

foo (param, enum_name);

在浏览代码时,我必须使用名称部分和前缀func_,而不是仅仅执行“跳转到定义”。

我想要一个宏,以便我的代码看起来像这样:

foo (param, f2e(func_name));

这样我就可以保持现有代码不变,仍然可以进行“跳转到定义”。

是否可以拥有这样的宏?最简单的解决方案是省略func_,这意味着f2e简单地附加enum_ prefix,但我更喜欢一个我仍然可以拥有func_的解决方案。这可能吗?

1 个答案:

答案 0 :(得分:1)

这有点圆,但你可以这样做:

(我们假设,为了这个例子,您有三个可能的枚举值enum_oneenum_twoenum_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。


<强>替代

作为替代方案,如果您唯一需要的是功能名称方便,那么您可以使用IDE的“跳转定义”功能......您可以这样做:

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

然后你的电话会是这样的:

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

或许有点多余,但它会实现您的目标,而对代码的其余部分的干扰最小。