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

纯C语言中如何将函数作为参数传入另一函数并调用

问题原因

你的代码报错核心是两个写法错误:

  • 传参时写object()是立刻调用object函数,把它的int类型返回值传给run_func,根本不是传入函数本身,类型完全不匹配。
  • 函数参数声明用int a_lambda_function()虽然C会隐式调整为函数指针,但写法不严谨,空括号在C语法里不代表「无参数」,仅代表「参数未指定」,容易埋下类型兼容隐患。
纯C实现方案

纯C标准从C89开始就支持函数指针特性,完全不需要依赖C++,可以直接实现把函数作为参数传入、延后执行的需求,修正后的可运行代码如下:

#include <stdio.h>

// 目标执行函数,无参数时参数列表写void明确标识
int object(void) {
    printf("Hello, World!\n");
    return 0;
}

// 形参显式声明为函数指针:指向「返回值为int、无参数」的函数
int run_func( int (*a_lambda_function)(void) ) {
    // 通过函数指针调用传入的目标函数
    a_lambda_function();
    return 0;
}

int main(void) {
    // 传参只写函数名(不要加括号!),函数名会自动退化为对应函数指针
    run_func(object);
    return 0;
}
关键规则说明
  • 传函数本身时只需要写函数名,绝对不要加后面的(),加()就变成当场调用函数、传返回值的逻辑。
  • 函数指针的声明格式固定为返回值类型 (*指针变量名)(参数类型列表),不要漏写指针外面的括号,否则会被识别为「返回int*指针的函数」声明。
  • 调用函数指针时,直接用指针名(实参)的写法即可,C会自动处理解引用;兼容老代码的写法(*指针名)(实参)也可以正常运行,效果完全一致。
  • 如果需要实现类似闭包(携带上下文)的函数传递,可以给函数指针增加一个void*类型的上下文参数,调用时把自定义数据的指针传进去,这也是纯C环境下实现回调逻辑的通用方案。

内容的提问来源于stack exchange,提问作者user19211708

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:06:57