gpt4 book ai didi

c - 变量声明,使用 libuv

转载 作者:太空狗 更新时间:2023-10-29 15:33:08 25 4
gpt4 key购买 nike

我正在尝试学习如何使用 libuv。我在 mac OS X 上下载并安装了库。我可以编译和运行小型测试程序,一个只启动一个回调循环然后退出,因为没有观察者,另一个创建一个空闲观察者并在时间用完时退出。

我一直在尝试查看文件 io 的示例,但遇到了问题。获取文件描述符的函数原型(prototype)为:

 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 的说明或示例。

编辑更新在 libuv 代码中,在 uv.h 文件中。我发现

typedef struct uv_fs_s uv_fs_t;

我一直在代码中寻找的其中一件事是实际定义此结构的位置。我使用 google 搜索了 typedef 并了解了一些有关如何使用 typedef 来命名的信息,这样您就不必在每次要声明结构实例时都键入 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;
}

最佳答案

您声明函数的原型(prototype) 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的地址并创建所需的指针。这应该工作得很好。但是,从您的原始错误消息来看,我认为您没有发布所有相关代码。让我们看看这个错误信息:

invalid conversion from ‘void (*)(uv_fs_t)’ to ‘void (*)(uv_fs_t*)’

这表明编译器需要一个指向函数的指针,该函数返回 void 并采用单个参数,该参数是指向 uv_fs_t 的指针。 .另一方面,您提供了一个指向函数的指针,该函数返回 void 并采用 uv_fs_t 类型的单个参数。 (即不是指向 uv_fs_t指针)。

这表明 open_req是一个函数(或指向函数的指针)。为了进一步帮助您,请使用此函数的声明以及如何初始化 open_req 来编辑您的原始问题。如果它是指向函数的指针而不是函数本身的名称,则为变量。

编辑:

再次查看您的问题后,open_req很可能不会导致原始错误。您应该将代码改回原来的样子。

另一方面,on_open很可能导致问题。你用原型(prototype)声明这个函数

void on_open(uv_fs_t);

但是定义的第一行是

void on_open(uv_fs_t *req)

删除 *从函数定义的第一行开始,看看会发生什么。

关于c - 变量声明,使用 libuv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15624074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com