C:typedef 结构内的函数指针



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

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

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

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 myList;
myList.addMSG = addMSGImpl;

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

  • 创建一个函数来初始化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};
只要

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

如果你有一个链表结构,有时你需要一个函数,有时你不需要,那么只需在创建列表时为其分配NULL,并让你的列表实现只在函数不NULL时才调用该函数。

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

相关内容

  • 没有找到相关文章

最新更新