功能指针解除引用,参数不同

时间:2014-05-28 17:39:25

标签: c stack function-pointers

我想创建一个处理回调的C模块:

typedef struct {
  int enable;
  void (*callback)(void);
  void *obj;
} Callback;

void Callback_Notify(Callback *me) {
  if (me->enable && me->callback) me->callback(me->obj);
}

但是,使用此回调模块的模块具有带(不同)参数的回调。我目前的解决方案是预处理器黑客(遗漏了\):

#define Callback_Notify1Arg(me, cb_type, arg1)
  if (me->enable && me->callback)
    ((cb_type)me->callback)(me->obj, arg1);

#define Callback_Notify2Arg(me, cb_type, arg1, arg2)
  if (me->enable && me->callback)
    ((cb_type)me->callback)(me->obj, arg1, arg2);

现在使用Callback的模块如下所示:

typedef void (*SomeModuleCb_t)(int);
typedef struct { Callback cb; } SomeModule;
void SomeModule_DoSomething(SomeModule *me) {
  int someData;
  Callback_Notify1Arg((&me->cb), SomeModuleCb_t, someData);
}

守则有效!但是我想知道堆栈是否存在损坏?编译器是否正确地围绕SomeModule_DoSomething中的Callback用法分配/解除分配堆栈?对于Callback结构中的内存分配,回调指针的签名是否重要?

欢迎任何更好的解决方案!

感谢您的澄清!

1 个答案:

答案 0 :(得分:2)

只要函数指针指向接受该参数的函数,并将函数指针强制转换为原始类型,就不会出现问题。如果在进行调用之前转换为原始类型,则可以将函数指针强制转换为另一个函数指针。