【发布时间】:2021-12-08 17:01:49
【问题描述】:
我正在查看C11 Standard PDF (第463页),我对声明的词汇语法感到困惑。看起来像这样的代码在 C11 中似乎在语法上是有效的:
static;
static const int;
long int const typedef long;
即使这样的声明似乎没有任何用处。
具体来说,让我困惑的是这里的这一部分:
declaration:
declaration-specifiers init-declarator-list<opt> ;
declaration-specifiers:
storage-class-specifier declaration-specifiers<opt>
type-specifier declaration-specifiers<opt>
type-qualifier declaration-specifiers<opt>
function-specifier declaration-specifiers<opt>
alignment-specifier declaration-specifiers<opt>
似乎声明中的 init-declarator-list 已明确设为可选。没有它的声明还有用吗?
【问题讨论】:
-
这似乎与first constraint 相矛盾:除了 static_assert 声明之外的声明应至少声明一个声明符(函数的参数或结构或联合的成员除外)、标签或枚举的成员。
-
@Julius 声明符在函数原型的参数列表中是可选的。
-
我看到有一个约束!但我仍然不明白为什么它在语法中是可选的。参数列表似乎没有引用声明非终结符?
-
也许它在过去是(意外地)允许的,并且他们通过允许编译器继续接受它来保持兼容性(尽管有诊断)。 /// 或者他们可能喜欢用语法中的(可能是空的)列表来定义事物,并在需要的地方添加约束。