【问题标题】:C function calling without required parameters [duplicate]没有必需参数的C函数调用[重复]
【发布时间】:2015-05-27 19:01:36
【问题描述】:

我一直在查看由 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);
}

【问题讨论】:

  • 你知道什么是函数指针吧?看起来库使用函数指针来传递回调函数。
  • uv_fs_openit 调用 open_cb 时提供参数,作为函数指针参数提供。
  • 你的意思是把open_cb 传递给uv_fs_open 没有参数?那是因为你没有在那里提供参数,你只是告诉 uv_fs_open 要调用哪个函数以便 it 可以提供参数。
  • 假设您对 c 的经验很少(根据您问题的性质),您最好从实际的学习材料(书籍、教程、专用网站)中学习,而不是从其中一种开源世界中的高级代码。
  • @rreichel 您删除了您的评论,但您没有看到 uv_fs_open 对其参数 cb(作为 open_cb 传递)做任何事情的原因是它由宏称为POST

标签: c libuv


【解决方案1】:

libuv 使用一种称为 callback baton 的模式来实现其异步功能。理由很简单:让我们假设您想要异步执行某些操作。因此,您将回调函数作为function pointer 传递给完成后调用。 libuv 的函数以异步方式完成工作,并在完成后调用您指定的函数。

但是,如果您在多个地方调用这些函数,一旦调用回调,您将需要告诉哪个请求调用了回调。这就是 baton 对象的目的。在您的示例代码中,这是 open_req 变量(uv_fs_t 类型)。

你可以阅读更多关于 libuv 的文件系统操作here

【讨论】:

  • 感谢@Venemo!下面是一个快速跟进:编写回调以匹配 uv_fs_cb 类型的文档在哪里? API 文档没有指定
  • @rreichel 大多数时候,这些回调接受一个参数,其类型是指向 baton 对象的指针。我建议你看看 libuv 的书:nikhilm.github.io/uvbook 它还有一章文件系统操作:nikhilm.github.io/uvbook/filesystem.html
猜你喜欢
  • 2020-12-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多