这类似于Function pointer with undetermined paramater中的问题但是何时 我试过了,我得到了一个编译错误:
错误:函数'accessVariant'
的参数太多错误:无法忽略void值,因为它应该是
我在我的C文件顶部定义了这个:
typedef void (*callBackHandler)(void*);
callBackHandler accessVariant= NULL;
我有回拨注册功能:
void registerCallbackHandler(callBackHandler ptr_reg_callback)
{
if (ptr_reg_callback == NULL)
{
return;
}
else
{
accessVariant = ptr_reg_callback;
}
}
在代码中我检查了一些布尔值,然后我注册了一种特定类型的访问函数:
if (bool)
{
registerCallbackHandler((callBackHandler)aRead16);
}
else
{
registerCallbackHandler((callBackHandler)aRead32);
}
aRead16和aRead32中的每一个都采用不同类型的参数。
然后我打电话:
(*accessVariant)( (void*)arg1,(void*) arg2, (void*)&value )
答案 0 :(得分:0)
不要试图将方形钉子钉入圆孔,而是使用圆钉。将callBackHandler
声明为
typedef void (*callbackHandler)(void *, void *, void *);
您的功能没有未确定数量的参数。他们有三个参数。
请注意,由于显式void*
强制转换,您仍处于薄弱环境中。删除它们并相应地修复原型。
已添加:如果这些函数并非都具有完全相同的参数列表(例如第三个参数有时为uint16*
且有时为uint32*
的示例) ,那么你需要多个typedef并适当选择一个。
typedef void (*genericCallback)(void);
typedef void (*callbackUint32Uint16Pint16Ptr)(uint32, uint16, uint16 *);
typedef void (*callbackUint32Uint16Uint32Ptr)(uint32, uint16, uint32 *);
void aRead16(uint32, uint16, uint16 *);
void aRead32(uint32, uint16, uint32 *);
void registerCallbackHandler(genericCallback callback)
{
if (callback == NULL)
{
return;
}
else
{
accessVariant = callback;
}
}
void RegisterSomething()
{
if (use_the_uint16_callback)
{
registerCallbackHandler((genericCallback)aRead16);
}
else
{
registerCallbackHandler((genericCallback)aRead32);
}
}
void CallTheCallback()
{
if (use_the_uint16_callback)
{
((callbackVoidPtrVoidPtrUint16)accessVariant)(x, y, z16);
}
else
{
((callbackVoidPtrVoidPtrUint32)accessVariant)(x, y, z32);
}
}
这要求use_the_uint16_callback
在accessVariant
期间保持不变,因为在使用之前必须将函数指针强制转换回原始类型。
更新了以更改所有参数。以前的版本基于评论中提供的错误信息。 (前两个参数最初声称是指针,但在评论中显示它们不是。第三个参数最初声称是uint16
,但在评论中显示它实际上是uint16 *
。)< / p>