如何在struct中正确定义一个函数指针,它将struct作为指针?

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)


Jon*_*ler 8

有两种方法可以实现 - 对于您的示例结构.它们基本上是同构的.

  1. 使用结构标记,如各种其他答案中所示.

    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)
  2. 用于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这是不必要的.