[浏览C的BNF语法时,我认为声明的生产规则看起来像这样(根据https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of%20C%20in%20Backus-Naur%20form.htm,这很奇怪:]
<declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ;
为什么将*用作初始声明符?这允许诸如“ int;”之类的语句。或“无效”;即使在语义上无效,在语法上也有效。他们不能在生产规则中使用+代替*吗?
我尝试编译一个简单的程序以查看编译器的输出,并且它所做的只是发出警告。
输入:
void main() {
int;
}
输出:
test.c: In function ‘main’:
test.c:2:5: warning: useless type name in empty declaration
int;
^~~
[declaration-specifier
包括type-specifier
,其中包括enum-specifier
。像]这样的构造
enum stuff {x, y};
是有效的
declaration
,没有init-declarator
。
int;
之类的结构被constraints beyond the grammar排除:
除static_assert声明外的声明应至少声明一个声明符(函数的参数或结构或联合的成员除外),标记或枚举的成员。
语言不允许这种结构,请参见以下约束,例如C17 / 18§6.7: