You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在另一个函数的参数中调用函数?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:36:18