为什么允许空声明?

时间:2017-01-26 19:24:00

标签: c language-lawyer

为什么C允许空声明?它们都在语法级别明确允许,并且只有在编译时才会生成警告。

来自C标准附录A的作品declaration允许它在语法层面:

declaration
    = declaration_specifiers , ";"
    | declaration_specifiers , init_declarator_list , ";"
    | static_assert_declaration
    ;

(由我转为EBNF

1 个答案:

答案 0 :(得分:5)

C不允许空声明。见https://stackoverflow.com/a/33273777/103167

但它允许声明没有任何声明符,只有说明符,只要这些说明符创建一个类型标记。例如:

/* here begins the specifier */
struct tagS /* <-- there's the tag */
{
   int x;
} /* here ends the specifier */
/* no declarators */
;

这是定义用户定义类型结构的完全有用且合法的方法。

这就是为什么语法必须将声明者列表指定为可选。