没有必需参数的C函数调用

C function calling without required parameters

我一直在查看由名为 libuv 的库的开发人员提供的源代码。在一些示例代码中,他们将一个函数作为另一个函数的参数传递,但传递了 none 所需参数。参数是怎么填写的?我正在查看的函数是 uv_fs_open.

这是源代码的 link(功能代码请查看第 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 在其异步函数中使用了一种名为 callback baton 的模式。理由很简单:假设您想异步执行某些操作。因此,您将回调函数作为 function pointer 传递以在完成时调用。 libuv 的函数异步完成它们的工作,并在完成后调用您指定的函数。

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

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