使用不同的参数运行不同的函数 - 函数指针

时间:2013-11-13 23:51:48

标签: c pointers

这类似于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 )

1 个答案:

答案 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_callbackaccessVariant期间保持不变,因为在使用之前必须将函数指针强制转换回原始类型。

更新了以更改所有参数。以前的版本基于评论中提供的错误信息。 (前两个参数最初声称是指针,但在评论中显示它们不是。第三个参数最初声称是uint16,但在评论中显示它实际上是uint16 *。)< / p>