在C和C ++中允许使用以下语句的原因是什么?
const typedef;
它似乎没有任何实际意义。
此外,您可以执行此操作:const;
和typedef;
编辑:@AndreyT指出它不是标准定义的行为。对于完整的答案,我想知道在他们认为这类代码应该可编译时,GCC开发人员面前出现的任何可能的优势。
答案 0 :(得分:11)
这看起来像是一种堕落的宣言形式。
在C声明中不是声明。这是一个宣言。而且你上面所拥有的是不允许的。
6.7声明
2声明至少应声明一个声明者(声明除外) 函数的参数或结构或联合的成员),a 标记或枚举的成员。
在C ++声明中是一个声明。但是仍然不允许你拥有上述内容。来自C ++ 03
7声明
3在一个简单声明中,可选的init-declarator-list可以是 仅在声明类(第9节)或枚举(7.2)时省略, 也就是说,当decl-specifier-seq包含a时 class-specifier,一个带有类键(9.1)的详细类型说明符, 或者枚举者。
如果某些编译器在C或C ++代码中允许这样做,那么它必定是该编译器的一个怪癖。你应该将这个问题提交给作者。
您可能知道,C和C ++的语法不仅仅由语法指定。仅仅通过语法来完成它将是太复杂或完全不可能的。语法附带的文本会施加一些额外的限制。编译器通常会尊重语法本身,但是当涉及到那些精心设计的额外限制时......许多编译器允许一些违规行为漏掉。
我会做出有根据的猜测,这必须是“空声明”扩展的副作用。从一开始,空声明在C和C ++中是非法的。例如,此代码一直是非法的
void foo() {}; // In file scope
因为它遵循带有空声明的函数定义。但是,几乎所有编译器都接受它,允许空声明作为扩展。出于同样的原因你可以写
;;;; // In file scope
在文件中间并编译代码。您的示例中的内容也是一个空声明,您在其中添加了一些无关紧要的限定符和存储类说明符。
P.S。如果我错了,请纠正我,但C ++ 11将空声明合法化。我不确定C11。