const typedef;在C和C ++中

时间:2013-07-13 21:09:12

标签: c++ c const typedef

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

const typedef;

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

此外,您可以执行此操作:const;typedef;

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

1 个答案:

答案 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。