我正在为我所在的公司实现一项功能,但对于回调函数和函数指针有些疑惑。以下是示例代码:
struct callback {
int (*func) (int *, int);
};
static struct callback cbstruct;
void install_func(struct callback *cbstruct, int (*func) (int *, int))
{
cbstruct->func = func;
}
int write(int *integ)
{
return *integ;
}
int main() {
int * a = malloc(sizeof(a));
*a = 5;
install_func(&cbstruct, write);
printf("%d\n", (cbstruct.func)(a,3));
return 0;
}
正如您所看到的,这个程序使用函数指针为一个结构体注册回调。预期该函数接收两个参数(int*和int),但在示例代码中,“write”函数只接收了一个int*。
我本来以为会出现编译错误,但实际上只有一个警告:
funcpointer.c:24:26: warning: passing argument 2 of ‘install_func’ from incompatible pointer type
install_func(&cbstruct, write);
^
funcpointer.c:10:6: note: expected ‘int (*)(int *, int)’ but argument is of type ‘int (*)(int *)’
void install_func(struct callback *cbstruct, int (*func) (int *, int))
^
这个程序似乎可以正确运行,在屏幕上打印出5,但考虑到定义和声明中参数数量的差异,我不确定它是否被正确编写。
为什么它可以编译并工作(表面上)?这样做是否存在即将发生的问题?我不确定从main函数调用的第二个参数(3)会发生什么。
我之所以问这个问题,是因为最近我改变了一个回调函数的签名(添加了一个参数),我期望从调用这个回调函数的地方看到许多错误,但我只得到了一些警告,程序继续(表面上)正常运行。
谢谢!