繁体   English   中英

typedef函数指针->从不兼容的指针类型初始化

[英]typedef function pointer -> initialization from incompatible pointer type

我无法理解此警告的原因:

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_RomsFileSelectFilter typedef相匹配,所以我不明白为什么我被告知类型不兼容。 该程序似乎仍然可以运行,但是在这里出现此警告使我感到困扰。

您已将FileSelectFilter定义为指向typedef中的函数的指针:

typedef int (*FileSelectFilter)(const char*, struct dirent*);

FileSelectPararms ,将filter成员定义为:

FileSelectFilter *filter;

这意味着filter实际上是指向函数的指针。 这就是为什么在分配FileSelectFilter filter = params->filter;出错的原因FileSelectFilter filter = params->filter;

filter成员应简单定义为:

FileSelectFilter filter;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM