C 中的相互依赖定义
Co-Dependent Definitions in C
假设我们有一个结构上的函数指针,它以结构本身作为第一个参数,这是一个典型的回调场景。
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;
但是,这样做会省略函数指针类型定义,如果以后能够轻松引用它并用于静态类型检查、漂亮的错误消息等,那就太好了。
关于如何解决这个问题有什么建议吗?
编辑 "possible duplicate":
此场景涉及函数指针 typedefs
,这对许多人来说是神秘的。我认为这是该案例的一个很好的例子,此外,接受的答案非常干净、清晰和简单。
您可以通过为结构提供标记并使用结构的前向声明来实现。然后就可以使用函数指针的typedef,后续完成struct的定义。
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;
};
您需要定义结构体的标签
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;
假设我们有一个结构上的函数指针,它以结构本身作为第一个参数,这是一个典型的回调场景。
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;
但是,这样做会省略函数指针类型定义,如果以后能够轻松引用它并用于静态类型检查、漂亮的错误消息等,那就太好了。
关于如何解决这个问题有什么建议吗?
编辑 "possible duplicate":
此场景涉及函数指针 typedefs
,这对许多人来说是神秘的。我认为这是该案例的一个很好的例子,此外,接受的答案非常干净、清晰和简单。
您可以通过为结构提供标记并使用结构的前向声明来实现。然后就可以使用函数指针的typedef,后续完成struct的定义。
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;
};
您需要定义结构体的标签
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;