常量typedef;在C和C++; 是一个语句。但你上面所说的仍然是不允许的。来自C++03

常量typedef;在C和C++; 是一个语句。但你上面所说的仍然是不允许的。来自C++03,c++,c,constants,typedef,C++,C,Constants,Typedef,这似乎没有任何实际意义 此外,您还可以这样做:const和typedef 编辑:@AndreyT指出,这不是一种标准的行为。对于完整的答案,我想知道当GCC开发人员决定这种类型的代码应该是可编译的时,在他们面前出现的任何可能的优势。这看起来像是一种退化的声明形式 在C语言中,声明不是一个语句。这是一项宣言。你上面所说的是不允许的 6.7声明 2声明应至少声明一名声明人(除 函数的参数或结构或联合的成员),a 标记或枚举的成员 < C++声明中的P>是一个语句。但你上面所说的仍然是不允许的。来自C

这似乎没有任何实际意义

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


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

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

在C语言中,声明不是一个语句。这是一项宣言。你上面所说的是不允许的

6.7声明

2声明应至少声明一名声明人(除 函数的参数或结构或联合的成员),a 标记或枚举的成员

< C++声明中的P>是一个语句。但你上面所说的仍然是不允许的。来自C++03

7项声明

3在一个简单的声明中,可选的init声明器列表可以是 仅在声明类别(第9条)或枚举(7.2)时省略, 也就是说,当decl说明符seq包含 类说明符,一个带有类键的详细类型说明符(9.1), 或枚举说明符

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

正如你可能知道的,C和C++的语法不是单独由语法指定的。单凭语法来做就太复杂了,或者根本不可能。一些附加的限制是由伴随语法的文本施加的。编译器通常会尊重语法本身,但当涉及到那些复杂的附加限制时。。。许多编译器允许一些违规行为通过

我有根据地猜测,这一定是“空声明”扩展的副作用。自从开始,空声明在C和C++中是非法的。例如,此代码一直是非法的

void foo() {}; // In file scope
因为它遵循一个空声明的函数定义。然而,几乎所有编译器都接受它,允许将空声明作为扩展。因为同样的原因,你可以写作

;;;; // In file scope
在文件的中间,让您的代码编译。示例中还有一个空声明,在其中添加了一些无关紧要的限定符和存储类说明符


如果我错了,请纠正我,但是C++11使空声明合法化。我不确定C11。< /P>如果我是Linus Torvalds,我会说:“在C中,它唯一的目的是保持C++程序员的出局。”在另一个注释中,“代码> GCC < /Calp>和<代码> CLAN<代码>似乎允许(只发出警告)。使用
-Wall-ansi-std=c89-pedantic
。在C++11中合法化的空声明是包含一个标记的语法实体
。So
consttypedef这些东西仍然是非法的。@ Sasa.Sokka,您是否理解文件范围中的含义,或者您忽略了那些基本单词?@ Sasa.Sokka:因为C++中的局部声明是语句,所以在本地范围内不可能创建空声明。它将被简单地解释为一个空语句。空洞的陈述是完全合法的。因此,在本地范围内,您始终可以合法编写
while(true)。为了在C++中形成空声明,必须将它放置在不允许语句的地方。例如,在名称空间范围(文件范围)或类范围内。@Darrel Hoffman:虽然它确实是允许的,但与空语句无关。整个
for
构造是一个语句,但
for
标题中的各个部分不是语句。对于
规范,
的专用部分允许将其保留为空,而不是使用空语句的一般可能性。空语句就是让我们编写循环的东西,比如为(i=0;i<100;i++)(即紧跟在右括号后面的
)。