我正在尝试在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没有指向某个函数。但是,我不想指定一个函数来指向我想要使用链表的每一次。有没有很好的方法来获得函数指针而不必隐式地指向函数,或者你是否必须隐式地将它指向函数?
这只是这里显示的部分实现。最后,这个结构将具有所有必要的功能。这只是为了让这个问题简短而重要。
答案 0 :(得分:21)
您需要将该功能分配给该成员。我还建议给他们不同的名字:
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;
答案 1 :(得分:2)
你不能在struct的声明中添加默认值,但你可以做的是:
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};
答案 2 :(得分:1)
只要您不实际使用它,就可以使用未初始化的函数指针。如果你做想用它来调用一个函数,那么显然你必须为它分配一个函数。 C无法猜出您要使用的功能。
如果你有一个链表结构,有时你需要一个函数,有时你不需要,那么只需在创建列表时为其分配NULL
,并让你的列表实现只调用函数时它不是NULL
。
如果它总是指向同一个函数,那么只需在构造函数中进行赋值。