可以使用#Define预处理器指令用于函数标题(声明/定义)



我目前正在作为公司中的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;

最新更新