【发布时间】:2017-01-26 19:23:59
【问题描述】:
为什么 C 允许空声明?它们都在语法级别明确允许,并且仅在编译时生成警告。
来自 C 标准附件 A 的产生式 declaration 在语法级别允许它:
declaration
= declaration_specifiers , ";"
| declaration_specifiers , init_declarator_list , ";"
| static_assert_declaration
;
(被我改成了EBNF)
【问题讨论】:
-
因为它们有用吗?
struct tagS { int x; };正式声明不是空的吗? -
您在看什么版本的标准? C11 只显示第二个和第三个选项。
-
@BenVoigt 对!是的,这正式是一个空的声明。结构仅作为声明说明符 => type_specifier => struct_or_union 说明符处理。
-
@Leandros:很难将“你必须至少做一件不平凡的事情,但它可以在说明符中或在声明符列表中”作为语法结构来捕捉。 ..所以这是一个非语法语法规则。见stackoverflow.com/a/33273777/103167
-
@dbush C11 完全显示了上面显示的内容。
init_declarator_list被标记为可选。
标签: c language-lawyer