纯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
相关产品推荐
相关产品推荐

