如何在另一个函数的参数中调用函数?C语言实现方法答疑
结论
你给出的示例写法不可行。C语言原生支持将函数作为参数传入其他函数内部调用(即回调函数机制),但示例代码的函数参数类型声明存在错误,直接运行会触发未定义行为。
原代码错误点
- 函数签名不匹配:
Function_1是返回值为void、无入参的函数,但Function_2的形参void* Using_Function()实际等价于声明了一个指向「返回值为void*、无入参函数」的指针,和传入的Function_1类型完全不匹配。 - 声明方式易出错:直接在形参列表内写函数声明的写法可读性极差,很容易出现返回值、参数列表写错的问题,不推荐使用。
正确实现方式
C语言中传递函数作为参数,本质是传递函数入口地址(函数指针),必须保证传入函数的签名(返回值类型、参数列表)和形参声明的函数指针类型完全一致。
基础写法
直接在形参位置声明匹配的函数指针类型即可:
void Function_1(void) { // 自定义业务逻辑 } // 形参声明为:指向返回void、无入参函数的指针 void Function_2(void (*Using_Function)(void)) { // 前置逻辑 Using_Function(); // 内部直接调用传入的函数 // 后置逻辑 } int main(void) { Function_2(Function_1); // 函数名自动退化为函数指针,直接传入即可 // 显式写&Function_1效果完全等价,两种写法都合法 // Function_2(&Function_1); return 0; }
可读性优化写法
如果觉得函数指针的声明语法晦涩,可以用typedef提前定义函数指针类型,后续使用更清晰:
// 定义类型:Callback 是指向「返回void、无入参函数」的指针类型 typedef void (*Callback)(void); void Function_1(void) { // 自定义业务逻辑 } void Function_2(Callback func) { func(); } int main(void) { Function_2(Function_1); return 0; }
注意事项
- 如果传入的函数本身带参数,只需要在声明函数指针时把参数列表写对即可,比如要传入
int add(int a, int b)这类带参函数,对应的函数指针类型就是int (*)(int, int),调用时正常传参即可。 - 禁止传入签名不匹配的函数,否则会出现栈错乱、返回值异常等未定义问题,轻则逻辑错误,重则程序直接崩溃。
内容的提问来源于stack exchange,提问作者Dead_Lock
相关产品推荐
相关产品推荐

