根据这int foo()()()也是一个有效的声明符(显然不是),我在这里错过了什么?
ps:有一个cdecl 站点将 c 声明解密为普通单词,并将上面的 decl 翻译为“将 foo 声明为函数返回函数返回函数返回 int”
int foo()();根据您引用的语法规则,是一个语法上有效的声明。然而,它在语义上是无效的;它不符合6.7.6.3p1 [C11/N1570; 可能是您拥有的旧版本中的 6.7.5.3]。
6.7.6.3 函数声明符(包括原型)
约束条件
- 函数声明符不得指定函数类型或数组类型的返回类型。
这是语义规则而不是语法规则,因为这样编写标准更容易。在LR 语法中,从语法上禁止T name ( ... ) ( ... )甚至是不可能的。(C 的语法被设计为尽可能适合 LR(1);我记得只有几个地方不适合。)如果可能的话,它仍然会定义直接声明符复杂得多。这并不是[尝试]声明返回类型为函数类型的函数的唯一方法。语义约束涵盖了一个句子中的所有可能性。T name ( ... ) ( ... )
仅当您自己编写 C 解析器时,语义和句法规则之间的差异才重要。如果您只是想了解什么是有效的 C 程序,什么不是有效的 C 程序,那么int foo()();无论哪种方式都是无效的。
如果您试图通过阅读 C 标准的文本来了解什么是有效的 C 程序,什么不是有效的 C 程序,您应该知道 C 标准从未规定编译器必须为某些内容发出硬错误。如果做不到这一点,实施者通常采用 5.1.1.3 的第一句来定义警告和错误之间的界限:
如果预处理翻译单元或翻译单元包含违反任何语法规则或约束的情况,一致的实现应产生至少一条诊断消息(以实现定义的方式标识)
(黑体字:我的重点)。因此,您需要阅读语法规则以及所有“约束”部分的文本。