【问题标题】:typedef function pointer -> initialization from incompatible pointer typetypedef 函数指针 -> 从不兼容的指针类型初始化
【发布时间】: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


【解决方案1】:

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

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

FileSelectPararms 中,您将filter 成员定义为:

FileSelectFilter *filter;

这意味着filter实际上是一个指向函数指针的指针。这就是您在作业FileSelectFilter filter = params-&gt;filter; 中收到错误的原因。

filter 成员应该简单地定义为:

FileSelectFilter filter;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2021-02-21
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多