我想创建一个处理回调的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结构中的内存分配,回调指针的签名是否重要?
欢迎任何更好的解决方案!
感谢您的澄清!
答案 0 :(得分:2)
只要函数指针指向接受该参数的函数,并将函数指针强制转换为原始类型,就不会出现问题。如果在进行调用之前转换为原始类型,则可以将函数指针强制转换为另一个函数指针。