为何允许声明函数类型形参,却禁止用同方式声明函数类型变量?
问题解析:函数参数的函数类型 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
相关产品推荐
相关产品推荐

