【发布时间】:2014-09-30 12:26:44
【问题描述】:
我无法理解此警告的原因:
menu-file-select.c:41:29: warning: initialization from incompatible pointer type
违规代码是:
typedef int (*FileSelectFilter)(const char*, struct dirent*);
typedef struct {
const char *dir; //the directory path to read
const char *out; //where to copy the selected path
int outLen; //length of out buffer
FileSelectFilter *filter; //optional filter function
} FileSelectParams;
void showFileSelectMenu(FileSelectParams *params) {
/* ... */
FileSelectFilter filter = params->filter; // <-- warning generated here.
if(filter && !filter(path, ent)) continue;
/* ... */
}
int main(int argc, char **argv) {
/* ... */
FileSelectParams fsel = {
.dir = setting.lastpath,
.out = RomPath,
.outLen = sizeof(RomPath) - 1,
.filter = FileSelectFilter_Roms,
};
showFileSelectMenu(&fsel);
/* ... */
}
int FileSelectFilter_Roms(const char *path, struct dirent *file) {
/* ... */
}
据我所知,FileSelectFilter_Roms 匹配 FileSelectFilter 类型定义,所以我不明白为什么我被告知类型不兼容。该程序似乎仍然可以运行,但是在这里出现这个警告让我很困扰。
【问题讨论】:
-
FileSelectFilter已经是一个指向函数的指针(根据 typedef)。所以在FileSelectParams中,filter被定义为一个指向函数指针的指针——去掉*! -
为什么不做这个答案。 @isedev
-
很好,因为我有空……
-
作为替代方案(如果您不喜欢
typedefed 指针),您可以使用typedef函数而不是指向它的指针:typedef int FileSelectFilter(const char *, struct dirent *);
标签: c struct function-pointers typedef compiler-warnings