【问题标题】:C: Function pointer inside a typedef structC:typedef 结构内的函数指针
【发布时间】:2013-10-03 01:22:59
【问题描述】:

我试图在 C 中创建一个链表,但试图将它很好地打包到某种 C++ 样式类中。但是我在 C 中使用函数指针时遇到了一些问题。

typedef struct linkedList {
    int count;
    struct msgNode *front;
    struct msgNode *back;
    void (*addMSG)(unsigned char *, int, struct linkedList *);
} msgList;

void addMSG(unsigned char *data, int size, struct linkedList *self);

理想情况下,我希望它可以让您列出然后添加,您可以简单地在结构中调用“方法”(函数),模拟您在 C++ 中看到的行为。

目前我在调用 addMSG 时遇到分段错误,这当然是因为 addMSG 没有指向函数。但是,我不想在每次我想使用链表时都指定一个函数来指向。有什么好的方法可以让函数指针不必隐式指向函数,还是必须隐式指向函数?

这只是这里展示的部分实现。最后,这个结构将具有所有必要的功能。这只是为了使这个问题简短明了。

【问题讨论】:

  • 您正在创建不必要的动态开销。如果你想用 C 写,你应该接受 C 的习惯用法,用普通的函数来写。
  • In a previous answer of mine,我更详细地解释了如何以实际支持动态调度的方式完成此操作。

标签: c struct linked-list function-pointers typedef


【解决方案1】:

您需要将功能分配给成员。我还建议给他们起不同的名字:

typedef void (*addMSGFunc)(unsigned char *, int, struct linkedList *);

typedef struct linkedList {
    int count;
    struct msgNode *front;
    struct msgNode *back;
    addMSGFunc addMSG;
} msgList;

void addMSGImpl(unsigned char *data, int size, struct linkedList *self)
{
    ...
}

然后在创建一个 msgList 之后:

msgList myList;
myList.addMSG = addMSGImpl;

【讨论】:

  • myList.addMSG = addMSGImpl; 如何传递参数?
  • @saru95 当你调用它时:myList.addMsg(buffer, 20, list)
【解决方案2】:

只要您不实际使用它,您就可以拥有一个未初始化的函数指针。如果你确实想用它来调用一个函数,那么显然你必须给它分配一个函数。 C 无法猜测您要使用哪个函数。

如果您有一个链表结构,有时您需要一个函数,而有时您不需要,那么只需在创建列表时将NULL 分配给它,并让您的列表实现仅在不需要时调用该函数NULL.

如果它总是指向同一个函数,那么只需在你的构造函数中进行赋值。

【讨论】:

    【解决方案3】:

    你不能在结构的声明中添加默认值,但你可以做的是:

    • 创建一个函数来初始化 linkedList 实例 - 我猜你已经在 C 风格的库中看到了
    • 创建一个默认列表项并在创建新实体时使用它。

    喜欢:

    void addMSG(unsigned char *data, int size, struct linkedList *self);
    
    struct linkedList {
        int count;
        struct msgNode *front;
        struct msgNode *back;
        void (*addMSG)(unsigned char *, int, struct linkedList *);
    } DefaultList = {0, NULL, NULL, addMSG};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多