没有必需参数的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。
我一直在查看由名为 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。