gpt4 book ai didi

无需参数的 C 函数调用

转载 作者:行者123 更新时间:2023-11-30 18:54:19 30 4
gpt4 key购买 nike

我一直在查看由 libuv 库的开发人员提供的源代码。在某些示例代码中,它们将一个函数作为另一个函数的参数传递,但没有传递任何必需的参数。参数如何填写?我正在查看的函数是 uv_fs_open。

这里是源代码的链接(查看第 1000 行的函数代码):https://github.com/libuv/libuv/blob/202195c2f45ced200ccf880ff4502eee94f11ab5/src/unix/fs.c
这是示例代码:

int main() {
loop = uv_default_loop();

int r = uv_fs_open(loop, &open_req, path, O_RDONLY, S_IRUSR, open_cb);

if (r) {
fprintf(stderr, "Error at opening file: %s.\n",
uv_strerror(uv_last_error(loop)));
}

uv_run(loop, UV_RUN_DEFAULT);

return 0;
}

void open_cb(uv_fs_t* req) {
int result = req->result;

if (result == -1) {
fprintf(stderr, "Error at opening file: %s.\n",
uv_strerror(uv_last_error(loop)));
}

uv_fs_req_cleanup(req);
uv_fs_read(loop, &read_req, result, buf, sizeof(buf), -1, read_cb);
}

最佳答案

libuv 使用名为回调接力棒的模式来实现其异步函数。基本原理非常简单:假设您想要异步执行某些操作。因此,您将回调函数作为 function pointer 传递。完成后打电话。 libuv 的函数异步完成工作,并在完成后调用您指定的函数。

但是,如果您有多个地方调用这些函数,那么一旦调用回调,您就需要告诉哪个请求调用该回调。这就是接力棒对象的目的。对于您的示例代码,这就是 open_req 变量(类型为 uv_fs_t)。

您可以阅读有关libuv的文件系统操作的更多信息here .

关于无需参数的 C 函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30490999/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com