根据你引用的语法规则,int foo()();
是一个syntactically有效的声明.然而,它是semantically无效的;它不符合6.7.6.3p1中的约束[C11/N1570;可能在您正在阅读的不同位置].
6.7.6.3函数声明符(包括原型)
Constraints
- 函数声明符不应指定函数类型或数组类型的返回类型.
这是一条语义规则,而不是语法规则,因为这样更容易编写标准.在句法上禁止T name ( ... ) ( ... )
甚至可能不是LR(1) grammar中的possible.(C的语法tries是LR(1),尽管我记得它没有完全实现它.)如果可能的话,它仍然会使direct-declarator的定义变得复杂得多.T name ( ... ) ( ... )
并不是[try ]声明返回类型为函数类型的函数的唯一方法.语义约束在一句话中涵盖了所有的可能性.
只有当您自己编写C解析器时,语义规则和语法规则之间的差异才重要.如果您只是想了解什么是有效的C程序,什么是无效的C程序,那么int foo()();
无论是哪种方式都是无效的.
如果您试图理解什么是有效的C程序by reading the text of the C standard,什么不是有效的C程序by reading the text of the C standard,您应该知道C标准从来不会说编译器must会为某些东西发出硬错误.如果做不到这一点,实施者通常采用5.1.1.3的第一句话来定义警告和错误之间的界限:
如果预处理翻译单元或翻译单元包含违反任何syntax rule或constraint的情况,则符合性实现应产生至少一个诊断消息(以实现定义的方式标识
(黑体字:我的强调).所以,你需要阅读语法规则和所有"约束"部分的文本.