在C中使用#define预处理器指令用于函数头(声明/定义)是否可以?

时间:2017-10-02 10:42:37

标签: c macros

我目前正在作为公司的C Developer开发一些项目,在我们的代码中,有许多大型函数声明用于不同类型的处理(例如状态机回调,事件回调,定时器等)和每种类型的处理程序声明都具有相同的语义,例如事件处理程序:static void onEvent1(Event event, EventArgs *args);

这样的处理程序可能会非常多,并且括号中有很多参数,所以我决定用一个小宏替换它以提高可读性并简化代码编写,如下所示: #define EVENT_HANDLER(funcName) static void funcName(Event event, EventArgs *args)

因此示例代码如下所示:

没有#define

static void onEvent1(Event event, EventArgs *args);
static void onEvent2(Event event, EventArgs *args);
static void onEvent3(Event event, EventArgs *args);
使用#define

EVENT_HANDLER(onEvent1);
EVENT_HANDLER(onEvent2);
EVENT_HANDLER(onEvent3);

在我用这样的宏添加代码后,我听到同事们在我的地址中听到了很多批评,但没有明确的理由说明它不好。我已经google了一个答案,据我所知,这样的文本替换宏不会造成伤害,也不会降低代码理解。所以,有人可以给我一个清晰的信息:以这种方式使用#define是否真的是一个坏习惯,或者不是,并且最无礼的:为什么?

感谢)

1 个答案:

答案 0 :(得分:2)

您可以使用常规typedef来保证类型安全。它避免了预处理器的缺陷,也不需要在语言中发明自己的语言。你的同事有一点意见。

typedef void EventCB(Event, EventArgs *);

按照您的预期使用它:

static EventCB onEvent1;
static EventCB onEvent2;
static EventCB onEvent3;

定义函数时,您需要重复原型,但编译器会进行类型检查并警告您任何错误。使用类型系统工作的另一个好处是能够使用相同的类型来声明指针:

EventCB *func_ptr = &onEvent1;