我正在尝试用 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
时才调用该函数。
如果它总是指向同一个函数,那么只需在构造函数中执行赋值即可。