我正在阅读this C BNF语法。我有以下问题:
<declarator>
作业是正确的:id(int a, int b)
(在<direct-declarator>
中)依此类推到函数原型/定义等参数中的数组; <function-definition>
中,为什么<declarator>
后跟{<declaration>}*
?
根据我的理解,它可以使类型名称或存储类有效,后跟像id(int a, int b) int
这样的函数头。但我确信它在C中无效。我错过了什么?答案 0 :(得分:4)
是的,该语法中的<declarator>
是要声明的对象的名称,加上其参数或数组大小(以及其类型的指针限定符)。 <declarator>
不包括基类型(函数的返回类型;数组的元素类型)。
请注意,<direct-declarator>
中有两个备选方案,它们似乎都与函数相关:
<direct-declarator> ( <parameter-type-list> )
<direct-declarator> ( {<identifier>}* )
第一个是我们通常认为的函数声明,其中参数是types或types-with-parameter-name。第二个只是一个标识符列表。 (我认为它应该是一个以逗号分隔的标识符列表。)第二种情况是旧式&#34; K&amp; R&#34;函数定义语法,你可能以前从未见过,并且应该在阅读这个答案之后立即忘记,因为 - 虽然C编译器仍然接受它 - 它已经被弃用了不仅仅是几年,而是几十年。所以不要使用它。为了历史的完整性,请查看它的外观:
int foo(n, p)
int n;
char p;
{
/ Body of the function */
}