如何定义函数指针和结构?

How to define a function pointers and and structure?

如何定义一个以结构作为参数的函数指针...并且该结构包含函数指针?

此代码无法编译:

typedef struct _INFOS_STRUCT {
    int val1;

    PTR_NEXT_ACTION nextAction;
    //void* (*nextAction)(struct _INFOS_STRUCT  * infos); // how to replace void* by PTR_ACTION* ?
} INFOS_STRUCT;
typedef void (*PTR_ACTION)(INFOS_STRUCT * infos);
typedef PTR_ACTION (*PTR_NEXT_ACTION)(INFOS_STRUCT * infos);

INFOS_STRUCT infos_list[10];
void run(int index){
    INFOS_STRUCT * infos = &infos_list[index];
        
    PTR_ACTION action = infos->nextAction(infos);
    while(action){
        action(infos);
        action = infos->nextAction(infos);
    }
}

一种可能的方式:

//do the typedef first, on a forward declaration
typedef struct INFOS_STRUCT INFOS_STRUCT
typedef void (*PTR_ACTION)(INFOS_STRUCT * infos);
typedef PTR_ACTION (*PTR_NEXT_ACTION)(INFOS_STRUCT * infos);
struct INFOS_STRUCT {
    int val1;
    PTR_NEXT_ACTION nextAction;
};

注意:将标签从 _INFO_STRUCT 更改为 INFO_STRUCT_INFO_STRUCT 是保留名称。如果您需要标签与 typedef 名称不同,您可以使用 INFO_STRUCT_(未保留)。


解释:

这个想法很简单。一旦你转发声明一个结构或联合,比如:

struct foo; 
union bar;

您可以 declare/define 指向它的指针,例如

struct foo *ptr0;
union bar ***ptr1;

如果指针定义在同一范围内的另一个 struct/union 定义中,或者只是在同一范围内的普通定义中,您甚至不需要前向声明(注意函数参数,即使在声明位于嵌套范围内,因此您确实需要 struct foo; void takefooptr(struct foo*);).

中的前向声明

当您随后使用 struct foo { /*...*/ }; 进行前向声明 struct foo 时,类型就完成了,您可以开始声明实际的 struct foo 变量而不仅仅是指针。

如果想在以后的使用中跳过struct/union关键字,可以typedef前向声明:

struct foo;
typedef foo foo; //or typedef foo SOMENEWNAME;

或一步完成

typedef struct foo foo;

作为 C 标准的一个怪癖,枚举不允许 forward-declaration 这件事。仅限结构和枚举。