我需要在C中定义一个结构和一个回调函数类型,如下所示:
typedef void (*callback)(struct XYZ* p);
struct {
int a;
int b;
callback cb;
} XYZ;
现在这段代码无法编译,因为每个定义都需要另一个。 我的意思是,如果回调定义首先出现,它将无法编译,因为它需要定义结构。类似地,如果首先定义结构,则需要定义回调。也许这是一个愚蠢的问题,但有没有一种解决此类问题的简洁方法?
目前我的想法是使用void *作为回调参数,并将其强制转换为回调内的结构XYZ。有什么想法吗?
答案 0 :(得分:8)
在函数struct
之前声明typedef
(尚未定义):
struct XYZ;
typedef void (*callback)(struct XYZ* p);
struct XYZ { // also fixed an error where your struct had no name
int a;
int b;
callback cb;
};
类似于声明函数原型并在定义之前调用它。
答案 1 :(得分:0)
我建议使用以下方法:
typedef struct xyz // xyz is a struct tag, not a type
{
int a;
int b;
void (*callback) (struct xyz* p); // this definition is local, "temporary" until the function pointer typedef below
} xyz_t; // xyz_t is a type
typedef void (*callback_t) (xyz_t* p);
现在,就调用者而言,你的结构与以下内容相同:
// This is pseudo-code used to illustrate, not real C code
typedef struct
{
int x;
int y;
callback_t callback;
} xyz_t;
使用示例:
void func (xyz_t* ptr)
{ ... }
int main()
{
xyz_t some_struct =
{
1, // a
2, // b
&func // callback
};
xyz_t another_struct =
{ ... };
some_struct.callback (&another_struct); // calls func
}