C语言中向单参数回调函数传双参数的可行性咨询
问题描述
我有以下可正常运行的C语言代码func1和func2:
void func1(int (*callbackf)(void *, void *)){ void a = NULL; void b=NULL; //do some work and then call comp callbackf (a,b) } void func2(int (*callbackf)(void *), void *a, void *b){ // do some work, not necessary works on a and b. callbackf(a,b); }
我希望编写如下func3代码:
void func3(int (*callbackf)(void *), void *a, void *b){ // do some work, not necessary works on a and b. callbackf(a,b); }
请问这样的实现是否可行?是否具备合理性?
分析与解答
1. 可行性:编译不通过,完全不可行
你的代码存在两处致命错误,直接无法通过编译:
func1变量声明非法:void a = NULL;不符合C语言语法,void不能作为变量类型,必须改为void *a = NULL;,否则编译器会直接报错。- 回调函数参数不匹配:
func3声明的回调类型是int (*callbackf)(void *)(仅接受1个void*参数),但调用时却传入了两个参数callbackf(a,b);,C语言不允许这种参数数量不匹配的函数调用,编译阶段就会被拦截。
2. 合理性:逻辑完全不成立
即便忽略编译错误,从设计逻辑上看func3也完全不合理:
- 如果你的回调函数需要接收两个
void*参数,那func3的回调参数类型应该和func1保持一致,声明为int (*callbackf)(void *, void *)。 - 如果回调函数仅需一个参数,那
func3传入两个参数的行为毫无意义,既不符合函数定义,还会触发运行时未定义行为。
修正建议
根据实际需求,有两种正确的实现方向:
场景1:回调需要两个参数
void func3(int (*callbackf)(void *, void *), void *a, void *b){ // do some work callbackf(a, b); }
场景2:回调仅需一个参数
void func3(int (*callbackf)(void *), void *a){ // do some work callbackf(a); }
内容的提问来源于stack exchange,提问作者AlexGiov
相关产品推荐
相关产品推荐

