C typedef函数原型结构体尝试在定义之前引用。

7

我需要引用一个尚未定义的结构体,因为该结构体实际上包含了typedef函数原型。

例如,

typedef int (MyCallbackFunction)(X * x, void * ctx);

typedef struct CallbackData {
  MyCallbackFunction * callback;
  void * ctx;
} CallbackData;

typedef struct X {
  char a;
  int b;
  int c;
  double d;

  CallbackData e;
} X;

“这段代码/头文件的有效编写方式是什么?”
3个回答

5

只需前向声明相关类型,您就可以将函数指针作为typedef的一部分:

struct X_;

typedef int (*MyCallbackFunction)(struct X_ * x, void * ctx);

typedef struct CallbackData_ {
  MyCallbackFunction callback;
  void * ctx;
} CallbackData;

typedef struct X_ {
  char a;
  int b;
  int c;
  double d;

  CallbackData e;
} X;

如果我传递一个使用例如 int callback(X * x, void * ctx) 的回调函数,这样会起作用吗?还是编译器会抱怨 Xstruct X 不同? - Adam M-W
抱歉,我已经修复了 -- 我通常更喜欢给结构体和它的typedef不同的名称,这样你可以根据需要明确地引用两者。请参见编辑。 - Kerrek SB

5

只需前向声明您的typedef

typedef struct X X;
typedef struct CallbackData CallbackData;

然后稍后声明struct


0

是的,你可以前向声明结构体并在MyCallbackFunction的声明中使用它,而不需要它成为一个完整的类型。

struct X;
typedef int (MyCallbackFunction)(struct X * x, void * ctx);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接