我目前正在作为公司的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是否真的是一个坏习惯,或者不是,并且最无礼的:为什么?
感谢)
答案 0 :(得分:2)
您可以使用常规typedef
来保证类型安全。它避免了预处理器的缺陷,也不需要在语言中发明自己的语言。你的同事有一点意见。
typedef void EventCB(Event, EventArgs *);
按照您的预期使用它:
static EventCB onEvent1;
static EventCB onEvent2;
static EventCB onEvent3;
当定义函数时,您需要重复原型,但编译器会进行类型检查并警告您任何错误。使用类型系统工作的另一个好处是能够使用相同的类型来声明指针:
EventCB *func_ptr = &onEvent1;