常量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中合法化的空声明是包含一个标记的语法实体代码>。Soconsttypedef代码>这些东西仍然是非法的。@ Sasa.Sokka,您是否理解文件范围中的含义,或者您忽略了那些基本单词?@ Sasa.Sokka:因为C++中的局部声明是语句,所以在本地范围内不可能创建空声明。它将被简单地解释为一个空语句。空洞的陈述是完全合法的。因此,在本地范围内,您始终可以合法编写代码>或while(true)代码>。为了在C++中形成空声明,必须将它放置在不允许语句的地方。例如,在名称空间范围(文件范围)或类范围内。@Darrel Hoffman:虽然它确实是允许的,但与空语句无关。整个for
构造是一个语句,但for
标题中的各个部分不是语句。对于
规范,的专用部分允许将其保留为空,而不是使用空语句的一般可能性。空语句就是让我们编写循环的东西,比如为(i=0;i<100;i++)代码>(即紧跟在右括号后面的;
)。