如何在struct中正确定义一个函数指针,它将struct作为指针?
我有一个带回调函数的结构,回调函数需要一个指向结构的指针才能进行操作。 如何正确定义这些元素,以便在没有警告的情况下进行编译?
typedef struct { // some fields required for processing... int (*doAction)(struct pr_PendingResponseItem *pr); } pr_PendingResponseItem;
如果我删除pr参数上的“struct”属性,我会收到错误。 如果我留下它,我会收到一个警告:“它的范围只是这个定义或声明,这可能不是你想要的”
这一切都有效,但我想知道定义这种结构的正确方法。
另外相关的是定义一个自引用结构:
typedef struct LinkedItem_ { LinkedItem_ * prev; LinkedItem_ * next; void * data; } LinkedItem;
(我认为这是正确的,但如果与问题相关,则欢迎其他想法。)
您的函数指针引用struct pr_PendingResponseItem,但您尚未声明struct pr_PendingResponseItem。 你只需要一个名为pr_PendingResponseItem的未命名结构typedef(并且该名称尚未建立)。
给结构命名:
struct pr_PendingResponseItem { // some fields required for processing... int (*doAction)(struct pr_PendingResponseItem *pr); } ; typedef struct pr_PendingResponseItem pr_PendingResponseItem;
有两种方法可以实现 – 对于您的示例结构。 它们基本上是同构的。
-
使用结构标记,如各种其他答案中所示。
typedef struct pr_PendingResponseItem { // some fields required for processing... int (*doAction)(struct pr_PendingResponseItem *pr); } pr_PendingResponseItem; typedef struct LinkedItem { struct LinkedItem *prev; struct LinkedItem *next; void * data; } LinkedItem;
-
使用
typedef
为不完整的结构类型指定名称,并在结构定义中使用typedef
。typedef struct pr_PendingResponseItem pr_PendingResponseItem; struct pr_PendingResponseItem { // some fields required for processing... int (*doAction)(pr_PendingResponseItem *pr); }; typedef struct LinkedItem LinkedItem; struct LinkedItem { LinkedItem *prev; LinkedItem *next; void * data; };
请注意,结构标记与typedef
名称位于不同的名称空间中,因此不需要为typedef
和structure标记使用不同的名称。 另请注意,在C ++中, typedef
是不必要的。
这样的事情
typedef struct _pr_PendingResponseItem_ { // some fields required for processing... int (*doAction)(struct _pr_PendingResponseItem_ *pr); } pr_PendingResponseItem;
应该解决它。
(经过测试和工作)
添加上面的nos的答案。
这里的关键见解是,当处理像“typedef struct name1 {} name2;”这样的声明时,你实际上声明了两种类型,即“ struct name1 {};” 然后是“typedef struct name1 name2 ;”,其中“ struct name1 ”是一个类型,你必须使用语法“struct name1”来引用它,而“ name2 ”是一个类型,你将它称为“name2” ”。 您可以保留“name1”,在这种情况下,您只需定义第二种类型,第一种类型仍为匿名结构。
现在,在第一种情况下,如果要引用类型“struct pr_PendingResponseItem”,则需要声明该类型,而不是声明的匿名结构。 因此,将结构声明更改为“struct pr_PendingResponseItem”。
在第二种情况下,您尝试将结构类型称为前向引用(即在其定义完成之前引用它),这是允许的,但是为了引用结构类型,所需的语法是“struct name” 。 因此,您需要使用“struct LinkedItem_”替换定义中对“LinkedItem_”的前向引用。