我正在使用一个允许我在事件上附加回调的系统。在编译时,我不知道它们中有多少或类型。 由于这些回调没有可能的参数,我需要它们所有最终都由相同的代码处理,我需要为每个回调一些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创建一个函数指针结构和一个并行结构,这看起来很笨拙。
答案 0 :(得分:1)
我没有看到在运行时更改中断处理程序数量的方法,因为在调用处理程序时,它不知道它来自哪个处理程序数组的索引。所以array-index(即event-id)需要硬编码到处理程序中。
但是,您可能会开始考虑通过某些外部工具生成C源代码并将其添加到程序构建过程中。