从结构定义中声明指向接受结构的函数的指针?

时间:2014-08-06 11:18:26

标签: c arrays function pointers struct

感谢您的时间!我一直在四处寻找并找到几乎解决我问题的答案,但并不完全。

typedef struct
{
    int menuparams; //lots of these here
    void (*menufunction)(MENUSTRUCT);   //points to "void functionname(MENUSTRUCT *menu)"
}MENUSTRUCT;

我有一种情况,我想使用结构来存储函数指针。我的代码读取这些结构的数组(检查每个结构中的变量),并在确定要使用的适当的结构后,遵循其指向必要函数的函数指针。

但是,有问题的函数接受指向完全相同结构类型的指针,因为它们可能需要对相同类型的另一个结构执行某些工作。当遵循函数指针时,将传递此其他结构的指针。

我目前的实施似乎有效,但我想知道我将来是否会给自己带来麻烦。它编译并运行得很好,但是我在声明函数指针的行上得到以下警告:

  

警告:函数声明中的参数名称(无类型)

这是有道理的,因为我的结构在我完成声明之前并不存在。但我无法弄清楚如何最好地重写这一点,以便让结构包含对其自身类型的引用感到高兴。我已经研究了向前声明结构,但是编译器在我从上面的实现中移开的时候变得越来越暗。

如果我尝试过:

typedef struct menu
{
    int menuparamss; //lots of these here
    void (*menufunction)(menu);  
}MENUSTRUCT;

它至少可以编译和工作,但具有相同的警告。

因为它似乎在技术上并不是世界末日,但如果在未来的某个时刻,由于我的愚蠢,MCU可能会自发地迸发出火焰,我现在最了解它! / p>

2 个答案:

答案 0 :(得分:3)

很简单,只需使用完整的类型名称,或者转发声明typedef:

选项1:

typedef struct menu {
    int menuparamss;
    //Must use the whole type name, including the "struct" keyword
    void (*menufunction)(struct menu *);  //SHOULD BE A POINTER to the structure
}MENUSTRUCT;

选项2:

typedef struct menu MENUSTRUCT;

//Without typedef
struct menu {
    int menuparamss;
    void (*menufunction)(MENUSTRUCT*);  //SHOULD BE A POINTER to the structure
};

答案 1 :(得分:1)

首先定义类型MENUSTRUCT,然后定义结构MENUSTRUCT。

typedef struct MENUSTRUCT MENUSTRUCT; 
struct MENUSTRUCT
{
    int menuparams; //lots of these here
    void (*menufunction)(MENUSTRUCT*);
};