【发布时间】:2013-12-23 16:35:06
【问题描述】:
我正在使用一个允许我在事件上附加回调的系统。在编译时,我不知道其中有多少或它们将是什么类型。 由于这些回调没有可能的参数,并且我需要它们最终都由相同的代码处理,因此每个回调都需要一些 ID。我正在用 C 语言编程。
我看到了许多相关的问题,但没有一个能完全解决我想要实现的目标。这 例如,解决方案给出了动态创建函数指针数组的说明
https://stackoverflow.com/a/5488718/2207774
为了演示我在下面寻找的功能是目前有效的代码。我正在尝试用动态替换此代码,因为我目前需要猜测我需要的最大可能附件:
static void event_handler(int eventID);
static void int_0(void){event_handler(0);};
static void int_1(void){event_handler(1);};
static void int_2(void){event_handler(2);};
static void int_3(void){event_handler(3);};
static void (*interrupt_handlers[4])(void) = {int_0,int_1,int_2,int_3};
然后将每个附加到所需的事件:
api_call_register_event(SOME_EXTERNAL_ID, interrupt_handlers[eventID++]);
我想做的事:
static void (*int_n)(int);
void (**interrupt_handlers)( int );
然后我希望能够在我的代码中进行设置:
int number_required = 10;
interrupt_handlers = malloc(number_required, sizeof( void (*)( int ) ) );
然后将每个附加到所需的事件(注意此代码不起作用,int_n(eventID) 将评估功能):
interrupt_handlers[eventID] = int_n(eventID);
api_call_register_event(SOME_EXTERNAL_ID, interrupt_handlers[eventID++]);
如果有其他方法可以做到这一点,请告诉我有关简化此实施的任何建议。如果我可以将一个值作为参数传递给一个函数,而它仍然是一个指针,那就太好了。我想到的另一种可能性是具有函数指针的结构和 eventID 的并行结构,这似乎很笨拙。
【问题讨论】:
-
所以你确实不事先知道所有可能的函数签名(返回类型和参数的数量和类型和顺序的排列),对吧?
-
我很高兴只有一个整数参数和一个 void 返回。我不知道我需要多少个函数句柄。我也不知道每个 EventID 是什么。在上面的代码中,我展示了 EventID 递增,这实际上并不是我只想展示它们是不同值的情况,将其视为小于可能事件数的任何数字。
-
您创建数组的方法看起来不错。究竟是什么不起作用。在调用方面,您可以像函数一样踩函数指针。
int_n是干什么用的?你在哪里给后者赋值? -
@alk 我只能将 void foo (void) 形式的函数传递给回调 API。我需要所有这些事件来使用 int ID 调用我的 event_handler 方法。 int_n 函数通过允许我拥有一组 (void) 方法来弥补这一差距,这些方法使用正确的 ID 调用 event_handler。这是我希望能够在运行时指定的。表达这一点的另一种方式是我想要:interrupt_handlers[eventID] = {event_handler(eventID);}; 所以我想要一个进入 interrupt_handlers 的函数,它使用 eventID 调用 event_handler。
-
我看不到在运行时更改中断处理程序数量的方法,因为当处理程序被调用时,它不知道它来自处理程序数组的哪个索引。所以数组索引(即事件ID)需要硬编码到处理程序中。
标签: c arrays function pointers