如何定义函数指针和结构?
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 这件事。仅限结构和枚举。
如何定义一个以结构作为参数的函数指针...并且该结构包含函数指针?
此代码无法编译:
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 这件事。仅限结构和枚举。