4

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

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

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

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

目前我的想法是使用 void * 作为回调参数,并将其类型转换为回调内部的 struct XYZ 。有任何想法吗?

4

2 回答 2

10

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;
};

类似于声明一个函数原型并在其定义之前调用它。

于 2013-10-31T11:13:13.480 回答
1

我建议使用以下方法:

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
}
于 2013-10-31T12:26:01.010 回答