如何定义一个函数并在一个宏中使用它?

时间:2015-07-25 10:43:22

标签: c macros

我需要定义一个事件处理程序,然后将它添加到某个索引处的处理程序数组中。处理程序永远不会被它的真实名称调用,所以我想在一个地方处理定义和赋值。一个好的解决方案看起来像这样:

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中分配它,但是当我有许多处理程序时,这将是一个重复的信息,并且非常繁琐。还有哪些其他解决方案?

2 个答案:

答案 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。在初始化函数内部只进行初始化。