编译时,我多次遇到此错误:
gcc -o index.o -c -D_FILE_OFFSET_BITS=64 "-D FUSE_USE_VERSION=31" index.c
index.c:40:12: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
.write = o_write,
^~~~~~~
fuse的文档往往是不一致和稀疏的,所以我只需要在GitHub上查找其他文件系统实现,以找到正确的方法签名。
在这种情况下,我的问题是:
int o_write(const char*, char*, size_t, off_t, struct fuse_file_info*);
应该是
int o_write(const char*, const char*, size_t, off_t, struct fuse_file_info*);
我的问题是:
当我看到这个警告时,有没有简单的方法知道指针类型应该是什么?我花了很长时间追踪a proper implementation in sshfs,但我觉得有一个更简单的方法。
最佳答案
这或多或少是一个MCVE(Minimal, Complete, Verifiable Example),它会复制您显示的错误消息:
#include <sys/types.h> // size_t, off_t
struct fuse_file_info;
struct whatever
{
int (*write)(const char*, const char*, size_t, off_t, struct fuse_file_info*);
};
extern int o_wrong(const char*, char*, size_t, off_t, struct fuse_file_info*);
extern int o_write(const char*, const char*, size_t, off_t, struct fuse_file_info*);
struct whatever v1 = { .write = o_wrong };
struct whatever v2 = { .write = o_write };
当使用GCC 7.2.0(在运行macOS High Sierra 10.13.2的Mac上)编译包含所示代码的文件
fuse37.c
时,我得到:$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -c fuse37.c
fuse37.c:13:33: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
struct whatever v1 = { .write = o_wrong };
^~~~~~~
fuse37.c:13:33: note: (near initialization for ‘v1.write’)
cc1: all warnings being treated as errors
$
“注释”行中的辅助信息告诉您需要查找
write
成员的定义(结构类型struct whatever
)。当向函数调用传递不正确的类型参数时,将得到更好的消息:
$ cat fuse47.c
struct gizmotron;
struct megatron;
extern void calumniator(struct gizmotron *ptr);
extern void transformer(struct megatron *arg);
void calumniator(struct gizmotron *ptr)
{
transformer(ptr);
}
$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes -c fuse47.c
fuse47.c: In function ‘calumniator’:
fuse47.c:9:17: error: passing argument 1 of ‘transformer’ from incompatible pointer type [-Werror=incompatible-pointer-types]
transformer(ptr);
^~~
fuse47.c:5:13: note: expected ‘struct megatron *’ but argument is of type ‘struct gizmotron *’
extern void transformer(struct megatron *arg);
^~~~~~~~~~~
cc1: all warnings being treated as errors
$
现在您可以看到,该注释是关于预期类型和接收类型的显式说明。我不确定初始化中缺少额外信息(与函数调用相反)是故意的还是疏忽的。既然一种诊断是可能的,那么另一种也应该是可能的。可能值得向海合会维修小组询问是否可以升级。