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