C中的依存定义

时间:2019-01-03 03:10:47

标签: c conventions

假设我们在一个结构体上有一个函数指针,该结构体本身就是第一个参数,即典型的回调方案。

typedef void (*callback_type)(my_struct_type *mst, int whatever);

typedef struct {
    // lots of fun stuff
    callback_type notify_me;
} my_struct_type;

这可能会在第一个typedef上产生编译器错误。 error: unknown type name my_struct_type。颠倒定义会产生相同的结果,但未知类型为callback_type

简单的解决方案是执行以下操作:

typedef struct my_struct_type_S {
    // lots of fun stuff
    void (*notify_me)(my_struct_type_S *mst, int whatever);
} my_struct_type;

但是,这样做可以消除函数指针类型的定义,以后可以轻松引用它就很好了,并且可以用于静态类型检查,优美的错误消息等。

关于如何解决此问题的任何建议?

编辑“可能重复的内容”: 这种情况涉及许多人都无法理解的函数指针typedefs。我认为这是该情况的一个很好的例子,此外,公认的答案非常清晰,明确和简单。

2 个答案:

答案 0 :(得分:5)

您可以通过给struct一个标签并使用该结构的前向声明来做到这一点。然后,您可以将typedef用作函数指针,并随后完成该结构的定义。

typedef struct my_struct_type_S my_struct_type;

typedef void (*callback_type)(my_struct_type *mst, int whatever);

struct my_struct_type_S {
    // lots of fun stuff
    callback_type notify_me;
};

答案 1 :(得分:3)

您需要定义struct的标记

typedef void (*callback_type)(struct _my_struct_type *mst, int whatever);

typedef struct _my_struct_type {
    // lots of fun stuff
    callback_type notify_me;
} my_struct_type;