9

我正在尝试在 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 没有指向函数。但是,我不想在每次我想使用链表时都指定一个函数来指向。有什么好的方法可以让函数指针不必隐式指向函数,还是必须隐式指向函数?

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

4

3 回答 3

24

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

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;
于 2013-09-26T21:31:25.923 回答
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};
于 2013-09-26T21:33:19.380 回答
1

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

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

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

于 2013-09-26T21:31:51.917 回答