我有一个结构,其中有一个元素表示为void (*func)();
我知道void指针通常用于函数指针,但我似乎无法定义函数。我一直在dereferencing pointer to incomplete type
。我用Google搜索但无济于事。任何建议将不胜感激。
我正在尝试这样做:
struct callback * cb;
cb->func = *readUserInput;
ReadUserInput定义为:
void readUserInput(void)
{
}
回调定义如下:
struct callback {
void (*func)();
int pcount;
enum attr_type type;
void *p[0];
};
答案 0 :(得分:2)
您需要获取该函数的地址,而不是尝试取消引用它。
更改
cb->func = *readUserInput;
到
cb->func = &readUserInput;
此外,您正在创建一个具有垃圾值的指针,然后将其解除引用,从而导致未定义的行为。您需要以某种方式为其分配空间(malloc/free
或者只是在堆栈上分配空间):
struct callback cb; // put it on the stack
cb.func = &readUserInput;
或
struct callback * cb = malloc(sizeof(callback));
cb->func = &readUserInput;
...
free(cb);
答案 1 :(得分:2)
你有三个问题。
分配函数指针时的语法不正确,并且实际上并没有定义struct回调的实例。
你想说:
struct callback cb;
cb.func = readUserInput;
您可以显式获取readUserInput函数的地址,但这是不必要的。该语法如下所示:
struct callback cb;
cb.func = &readUserInput;
在标准C中,裸函数名称将被评估为函数的地址。
最后,你的回调有错误的签名。它被定义为一个函数,它接受未知数量的参数并且不返回任何内容。
结构中的声明调用指向函数的指针,该函数不带参数并且不返回任何内容。
将回调函数定义为:
void readUserInput()
{
}
或将结构中的声明更正为:
struct callback {
void (*func)(void);
int pcount;
enum attr_type type;
void *p[0];
};