12

在 C 和 C++ 中允许以下语句的最初原因是什么?

const typedef;

这似乎没有任何实际意义。

此外,您可以这样做:const;typedef;

编辑:@AndreyT 指出这不是标准定义的行为。对于完整的答案,我想知道 GCC 开发人员在决定这种类型的代码应该是可编译的时出现的任何可能的优势。

4

1 回答 1

11

这看起来像是一种退化的声明形式。

在 C 中声明不是语句。这是一个宣言。并且您上面的内容是不允许的。

6.7 声明

2 声明应至少声明一个声明符(函数的参数或结构或联合的成员除外)、标记或枚举成员。

在 C++ 中声明是一个声明。但是仍然不允许您使用上面的内容。从 C++03

7 声明

3 在简单声明中,可选的 init-declarator-list 只有在声明类(第 9 条)或枚举(7.2)时才能省略,即当 decl-specifier-seq 包含类说明符、带有类键(9.1)或枚举说明符的详细类型说明符。

如果某些编译器在 C 或 C++ 代码中允许这样做,那么它一定是该编译器的怪癖。你应该把这个问题直接问它的作者。

您可能知道,C 和 C++ 的语法并不仅仅由语法指定。仅通过语法来做到这一点太复杂或完全不可能。伴随语法的文本施加了一些额外的限制。编译器通常会尊重语法本身,但是当涉及到那些精心设计的附加限制时……许多编译器允许一些违规行为溜走。

我会做出有根据的猜测,这一定是“空声明”扩展的副作用。从一开始,空声明在 C 和 C++ 中就是非法的。比如这段代码一直是非法的

void foo() {}; // In file scope

因为它遵循带有空声明的函数定义。然而,几乎所有编译器都接受它,允许空声明作为扩展。出于同样的原因,你可以写

;;;; // In file scope

在文件中间并编译您的代码。您在示例中拥有的也是一个空声明,其中添加了一些无关紧要的限定符和存储类说明符。

PS 如果我错了,请纠正我,但 C++11 使空声明合法化。我不确定C11。

于 2013-07-13T21:15:41.463 回答