我需要定义一个事件处理程序,然后将它添加到某个索引处的处理程序数组中。处理程序永远不会被它的真实名称调用,所以我想在一个地方处理定义和赋值。一个好的解决方案看起来像这样:
MAKE_HANDLER(evet_code, my_event) {
//handle the event
}
我天真的解决方案是将其扩展到
void on_my_event(event* ev);
array_of_handlers[event_code] = &on_my_event;
void on_my_event(event* ev) {
//handle the event
}
显然这不起作用,因为赋值不能在全局范围内发生(除了通过常量初始化)。我知道我可以有一个宏定义函数,另一个宏在main中分配它,但是当我有许多处理程序时,这将是一个重复的信息,并且非常繁琐。还有哪些其他解决方案?
答案 0 :(得分:1)
[...]因为作业不能在全球范围内发生[...]
您可以使用constructor (search in this page)在启动时运行分配代码,而不会使主要功能混乱:
void on_my_event(event* ev);
void on_my_event_constructor(void) __attribute__((constructor));
void on_my_event_constructor(void) {
array_of_handlers[event_code] = &on_my_event;
}
void on_my_event(event* ev) {
//handle the event
}
虽然这绝不是便携式的。 (但也适用于GCC和clang,以及MSVC中的 apparently with some hacking。)
答案 1 :(得分:1)
您可以创建一个文件,例如handlers.inc,并将所有宏调用放在那里:
MAKE_HANDLER(a,b)
MAKE_HANDLER(c,d)
MAKE_HANDLER(e,f)
使用时,请执行以下操作:
#define MAKE_HANDLER(evet_code, my_event) .....
#include "handlers.inc"
#undef MAKE_HANDLER
仅在声明和定义的全局范围内定义MAKE_HANDLER。在初始化函数内部只进行初始化。