我正在浏览代码库的遗留代码,我遇到了以下代码:
void *sampleFunction(tUint8 **inParam1, tUint32 inParam2, char *inParam3, tUint32 inParam4, void* inArg1, void* inArg2)
{
X100 *foo = getFooValue(...);
return foo;
}
由于我无法发布确切的代码(因为它与工作有关),我已经发布了上面的示例(这正是它的样子)。
这里显示的 X100
是一个包含一些数据的结构,并且有一个回调函数,如下所示,上面的函数被分配给它(或者它对我来说是什么样的)
typedef void* (*tFileReadVerifyCallback)((tUint8 **inParam1, tUint32 inParam2, char *inParam3, tUint32 inParam4, void* inArg1, void* inArg2);
tFileReadVerifyCallback callBack;
//for a certain case :
callBack = sampleFunction;
现在,我有以下问题:
sampleFunction
返回foo
X100
类型?是因为回叫的行为有所不同吗?注意:我试图提供足够的信息,同时尽量保持最小化。如果需要更多输入,请告诉我,我会尝试编辑并添加更多信息。
答案 0 :(得分:4)
为什么
sampleFunction
返回foo
类型X100
?
不,它返回foo
,这是一个X100 *
,一个对象指针。指定回调以返回void *
,并且所有对象指针都可转换为void *
。回调没什么特别的。
void *
通常用于这种类型的擦除,以允许函数返回“任何东西”。你会看到它在回调中使用,因为目的是让客户端代码返回他们可能喜欢的任何对象指针。
当然,当返回指向任意对象的指针时,一个重要的问题就是“什么时候应该释放这个对象,如果有的话?”答案取决于接受回调的库,以及它如何记录与它的互动。