符合K&R语法的无效C声明疑问:int foo()()()为何存在矛盾?
问题解答
你忽略了C语言语法规则和语义约束的区别:语法上这个声明符能匹配,但语义层面C明确禁止函数返回函数类型。
语法层面的表象:
K&R第二版和C标准n1256的声明符语法规则确实允许递归推导,比如函数的返回类型可以被解析为另一个函数类型,所以int foo()()()能通过语法分析工具的解析,相关工具的翻译也是基于语法规则的字面解读。语义层面的硬限制:
C语言的核心语义规则明确规定:函数类型不能作为另一个函数的返回类型(也不能作为变量的类型)。你看到的语法规则只是描述了声明符的结构可能性,但实际语言实现会在语义检查阶段拦截这种写法,因为它违反了类型系统的基本约束。合法的替代写法:
如果要实现“返回函数入口地址”的逻辑,必须使用指向函数的指针作为返回类型。比如:int (*foo())():表示foo是一个函数,返回指向“返回int的函数”的指针。- 多层嵌套的合法写法是
int (*(*foo())())():表示foo是一个函数,返回指向“返回指向‘返回int的函数’的指针”的函数的指针。
内容的提问来源于stack exchange,提问作者mzoz
相关产品推荐
相关产品推荐

