c - 回调函数的返回类型
问题描述
我正在浏览我的代码库的遗留代码,我遇到了以下代码:
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
?是因为回调的行为不同吗? - 如果是这样,那么我的下一个问题是这些回调如何工作/返回值如何影响它?
注意:我试图提供足够的信息,同时尽量减少它。如果需要更多输入,请告诉我,我将尝试对其进行编辑并添加更多信息。
解决方案
为什么
sampleFunction
返回foo
类型为X100
?
不,它返回foo
which is a X100 *
,一个对象指针。回调指定为 return void *
,并且所有对象指针都可以转换为void *
. 回调没有什么特别的。
void *
通常用于这种类型的擦除,以允许函数返回“任何内容”。您会看到它在回调中使用,因为其目的是让客户端代码返回他们可能喜欢的任何对象指针。
当然,当返回指向任意对象的指针时,一个重要的问题是“什么时候应该释放这个对象,如果有的话?” 答案取决于接受回调的库,以及它如何记录与回调的交互。
推荐阅读
- angular - 我正在尝试在同一家商店中选择三个州,但我遇到了问题
- ios - 点击文本字段时获取表格视图部分索引
- rx-java2 - doOnDispose() 使用哪个 RxJava 调度程序?
- rest - 如何设计一个可扩展的 restful / Non-restful API?
- ios - 解码错误:无法读取数据。阿拉莫菲尔
- php - Angular 5 中基于 cookie 的身份验证
- python - 通过循环问题保存 .txt
- vue.js - IE 11 中的 VueJS - 不工作的模板包装器,适用于 Edge 和 Chrome
- vba - “无法访问文件”1004 导出工作表错误 VBA
- bluetooth-lowenergy - 在 BLE 设备的扫描响应数据包中获取 MAC 地址