我目前正在作为公司中的C开发人员从事某些项目,并且在我们的代码中,有许多针对不同类型的处理的大函数声明(例如状态机器回调,事件回调,计时器等)和每种类型的处理程序声明具有相同的语义,例如事件处理程序: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);
with #define :
EVENT_HANDLER(onEvent1);
EVENT_HANDLER(onEvent2);
EVENT_HANDLER(onEvent3);
我用这样的宏添加了对代码的更改后,我在地址中听到了很多批评家,但没有明确的理由为什么它不好。据我了解,我已经搜索了一个答案,据我了解,更换宏观的文本不会受到伤害或较低的代码理解。那么,有人可以给我带来清晰的信息:以这样的方式使用#Define是一个坏习惯
谢谢)
您只需使用常规typedef
即可安全。它避免了预处理器的陷阱,并且不需要在语言中发明自己的语言。您的同事有一点。
typedef void EventCB(Event, EventArgs *);
并按照您的期望使用:
static EventCB onEvent1;
static EventCB onEvent2;
static EventCB onEvent3;
当定义函数时,您需要重复该原型,但是编译器会进行键入检查并警告您任何错误。使用类型系统使用的另一个优点是使用相同类型来声明指针的能力:
EventCB *func_ptr = &onEvent1;