C中的互连结构和回调

时间:2013-10-31 11:09:54

标签: c coding-style callback compiler-errors

我需要在C中定义一个结构和一个回调函数类型,如下所示:

typedef void (*callback)(struct XYZ* p);

struct {
    int a;
    int b;
    callback cb;
} XYZ;

现在这段代码无法编译,因为每个定义都需要另一个。 我的意思是,如果回调定义首先出现,它将无法编译,因为它需要定义结构。类似地,如果首先定义结构,则需要定义回调。也许这是一个愚蠢的问题,但有没有一种解决此类问题的简洁方法?

目前我的想法是使用void *作为回调参数,并将其强制转换为回调内的结构XYZ。有什么想法吗?

2 个答案:

答案 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
}