我正在学习如何使用libuv。我在mac上下载并安装了该库。我可以编译和运行小的测试程序一个只启动一个回调循环,然后退出,因为没有监视器,另一个创建一个空闲的监视器,并在时间用完时退出。
我一直在尝试查看文件io的示例,但遇到了一些问题。函数获取文件描述符的函数原型为:
int uv_fs_open(uv_loop_t* loop,
uv_fs_t* req, // second argument
const char* path,
int flags,
int mode,
uv_fs_cb cb)我已经将示例代码减少到仍有错误的最小值。
#include <stdio.h>
#include <uv.h>
uv_fs_t open_req;
void on_open(uv_fs_t);
void on_read(uv_fs_t);
void on_write(uv_fs_t);
int main(int argc, char **argv) {
uv_fs_open(uv_default_loop(), &open_req, argv[1], O_RDONLY, 0, on_open);
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
return 0;
}
void on_open(uv_fs_t *req) {
if (req->result != -1) {
fprintf(stderr, "function called \n");
}
else {
fprintf(stderr, "error opening file: %d\n", req->errorno);
}
uv_fs_req_cleanup(req);
}我的open_req声明与close_req的声明完全相同,后者出现在完整的代码示例中,不会产生和错误。我添加了open_req的声明,因为编译器给了我一个“‘open_req’没有在这个作用域中声明”的错误。当我添加声明时,它将错误更改为“从‘void(*)(Uv_fs_t)’到‘void(*)(uv_fs_t*)’的无效转换”。我得到了同样的错误,而不是声明是否在main中。如果我将声明更改为指针声明
uv_fs_t* open_req; 然后我得到了错误:
cannot convert uv_fs_t** to uv_fs_t* for argument ‘2’ to
int uv_fs_open(uv_loop_t*, uv_fs_t*, const char*, int, int, void (*)(uv_fs_t*))我正在尝试浏览实际的libuv代码,看看我是否能弄清楚它,但代码很庞大,我使用的是这里的“libuv简介”:http://nikhilm.github.com/uvbook/,这就是示例代码的来源。
有没有其他的示例代码源码,我可以用来尝试和理解这个库?我的声明中有没有明显的错误之处?我不确定在哪里可以找到关于如何使用libuv的说明或示例。
在uv.h文件中编辑libuv代码中的更新。我发现
typedef struct uv_fs_s uv_fs_t;我一直在代码中寻找的一件事就是这个结构的实际定义位置。我在google上搜索了type,并了解了一些关于如何使用time来命名的知识,这样您就不必在每次声明struct的实例时都输入struct。尽管有些人似乎认为这是一种糟糕的做法,而另一些人则认为它很棒。为了获得最小样本,我删除了其中的一部分,将其作为名为close_req的us_fs_t类型的另一个声明。我直接从那个声明中复制了声明的格式。
我会看看我能找到什么关于指向函数的指针,我对它们只是略知一二,至少它给了我一个开始寻找的地方。
我找到了uv_fs_open的函数定义。
int uv_fs_open(uv_loop_t* loop,
uv_fs_t* req,
const char* path,
int flags,
int mode,
uv_fs_cb cb) {
INIT(OPEN);
PATH;
req->flags = flags;
req->mode = mode;
POST;
}发布于 2013-03-26 04:47:46
您可以声明函数uv_fs_open的原型是
int uv_fs_open(uv_loop_t* loop,
uv_fs_t* req,
const char* path,
int flags,
int mode,
uv_fs_cb cb)注意,第二个参数的类型是uv_fs_t*。因此,当您将open-rec声明为
uv_fs_t open_req;然后用以下参数调用uv_fs_open()
uv_fs_open(uv_default_loop(), &open_req, argv[1], O_RDONLY, 0, on_open);第二个参数(&open_req)获取open_req的地址并创建所需的指针。这应该可以很好地工作。但是,从您最初的错误消息来看,我认为您并没有发布所有相关代码。让我们来看看这条错误消息:
从‘void(*)(Uv_fs_t)’到‘void(*)(uv_fs_t*)’的转换无效
这说明编译器期望一个指向返回空的函数的指针,并接受一个指向uv_fs_t的指针的参数。另一方面,您提供了一个指向函数的指针,该函数返回uv_fs_t并接受uv_fs_t类型的单个参数(即,不是指向void的指针)。
这表明open_req是一个函数(或指向函数的指针)。为了进一步帮助您,请使用此函数的声明编辑您的原始问题,以及如果open_req变量是指向函数的指针而不是函数本身的名称,则如何初始化该变量。
编辑:
再次查看您的问题后,open_req很可能不会导致最初的错误。你应该把你的代码改回原来的样子。
另一方面,on_open很可能是导致问题的原因。您可以使用原型声明此函数
void on_open(uv_fs_t);但是定义的第一行是
void on_open(uv_fs_t *req)从函数定义的第一行中删除*,看看会发生什么。
https://stackoverflow.com/questions/15624074
复制相似问题