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

为何允许声明函数类型形参,却禁止用同方式声明函数类型变量?

问题解析:函数参数的函数类型 vs 函数内部的函数类型变量

为什么函数参数里的函数类型声明是合法的?

在C语言的标准规则里,当你在函数参数列表中声明一个函数类型的形参时,编译器会自动把它转换成对应的函数指针类型。也就是说:

void func(void why_is_this_allowed()) {
    why_is_this_allowed();
}

这段代码完全等价于:

void func(void (*why_is_this_allowed)()) {
    why_is_this_allowed();
}

和你的func2写法本质上没有区别,只是语法上的简化写法而已。编译器会帮你完成从函数类型到函数指针的隐式转换,所以这种写法是合法的。

为什么函数内部不能直接声明函数类型变量?

C语言里不存在函数类型的变量。函数本身存储在程序的代码段中,而变量存储在数据段、栈或堆中,两者的存储机制完全不同。你没办法直接定义一个“函数类型”的变量来存放函数,只能通过函数指针来间接引用函数的地址。

你代码里的错误写法:

void and_why_is_this_NOT_allowed() = print;

正确的写法应该是声明一个函数指针变量:

void (*and_this_is_allowed)() = print;

这样就可以合法地指向print函数,之后调用and_this_is_allowed()就能正常执行print的逻辑。

总结

  • 函数参数中的函数类型是语法糖,会被隐式转为函数指针
  • 函数内部必须显式声明函数指针变量来引用函数,不存在直接的函数类型变量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:54:55