Jef*_*ffV 8 c struct function-pointers
我有一个带回调函数的结构,回调函数需要一个指向结构的指针才能进行操作.如何正确定义这些元素,以便在没有警告的情况下进行编译?
typedef struct {
// some fields required for processing...
int (*doAction)(struct pr_PendingResponseItem *pr);
} pr_PendingResponseItem;
Run Code Online (Sandbox Code Playgroud)
如果我删除pr参数上的"struct"属性,我会收到错误.如果我留下它,我会收到一个警告:"它的范围只是这个定义或声明,这可能不是你想要的"
这一切都有效,但我想知道定义这种结构的正确方法.
另外相关的是定义自引用结构:
typedef struct LinkedItem_ {
LinkedItem_ * prev;
LinkedItem_ * next;
void * data;
} LinkedItem;
Run Code Online (Sandbox Code Playgroud)
(我认为这是正确的,但如果与问题相关,则欢迎其他想法.)
nos*_*nos 12
您的函数指针引用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;
Run Code Online (Sandbox Code Playgroud)
有两种方法可以实现 - 对于您的示例结构.它们基本上是同构的.
使用结构标记,如各种其他答案中所示.
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;
Run Code Online (Sandbox Code Playgroud)用于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;
};
Run Code Online (Sandbox Code Playgroud)请注意,结构标记与名称位于不同的名称空间中typedef,因此不需要为typedef结构标记使用不同的名称.还要注意,在C++中,typedef这是不必要的.