C动态函数指针数组,带有动态指定的参数

C动态函数指针数组,带有动态指定的参数,c,arrays,function,pointers,C,Arrays,Function,Pointers,我使用的系统允许我附加事件回调。在编译时,我不知道其中有多少个或它们将是什么类型。 由于这些回调没有可能的参数,并且我需要它们最终都由相同的代码处理,因此我需要为每个回调提供一些ID。我正在用C语言编程 我已经看到了许多相关的问题,但没有一个能够完全管理我试图实现的目标。这 例如,解决方案给出了动态创建函数指针数组的指令 为了演示我正在寻找的功能,下面是目前可用的代码。我正在尝试用动态代码替换此代码,因为我目前需要猜测我将需要的最大可能附件: static void event_handler

我使用的系统允许我附加事件回调。在编译时,我不知道其中有多少个或它们将是什么类型。 由于这些回调没有可能的参数,并且我需要它们最终都由相同的代码处理,因此我需要为每个回调提供一些ID。我正在用C语言编程

我已经看到了许多相关的问题,但没有一个能够完全管理我试图实现的目标。这 例如,解决方案给出了动态创建函数指针数组的指令

为了演示我正在寻找的功能,下面是目前可用的代码。我正在尝试用动态代码替换此代码,因为我目前需要猜测我将需要的最大可能附件:

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)将对函数求值):


如果有不同的方法,请让我知道任何关于简化此实施的建议。如果我能在函数还是指针的时候将值作为参数传递给函数,那就太好了。我想到的另一种可能是函数指针的结构和eventID的并行结构,这看起来很笨拙

我看不到在运行时更改中断处理程序数量的方法,因为当调用处理程序时,它不知道它来自处理程序数组的哪个索引。因此,数组索引(即事件id)需要硬编码到处理程序中


但是,您可能会开始考虑使用一些外部工具生成C源代码,并将其添加到程序构建过程中。

因此,您事先不知道所有可能的函数签名(返回类型的排列、参数的数量、类型和顺序),对吧?我很高兴只有一个整数参数和一个空返回。我不知道需要多少个函数句柄。我也不知道每个人的EventID是什么。在上面的代码中,我已经显示了Evund递增,这不是事实,我只是想显示它们是不同的值,认为它比任何可能的事件的数量少。到底什么是不起作用的。在调用方面,您可以像处理函数一样处理函数指针。什么是
int\u n
?在哪里为后者赋值?@alk I只能将形式为void foo(void)的函数传递给回调API。我需要所有这些事件来使用int ID调用我的event_handler方法。函数int_n允许我拥有一个(void)方法数组,这些方法使用正确的ID调用event_handler。这是我希望能够在运行时指定的。表达这一点的另一种方式是:中断处理程序[eventID]={event\u处理程序(eventID);};因此,我希望进入中断处理程序的条目是一个使用eventID调用事件处理程序的函数。我看不到在运行时更改中断处理程序数量的方法,因为调用处理程序时,它不知道它来自处理程序数组的哪个索引。因此,数组索引(即事件id)需要硬编码到处理程序中。
interrupt_handlers[eventID] = int_n(eventID);
api_call_register_event(SOME_EXTERNAL_ID, interrupt_handlers[eventID++]);