GNU89,混合声明和循环初始声明

3
GCC和ICC的默认C方言是GNU89。GNU89允许混合声明,例如:
int i;
i = 0;
int j;

我曾从stackoverflow中的其他帖子(例如C: for loop int initial declaration)错误地推断出这意味着我可以这样做:

for(int i=0; i<n; i++)

我尝试使用 GNU89,但是出现了以下错误:

error: 'for' loop initial declarations are only allowed in C99 mode

显然,混合声明和循环初始化声明不是同一回事(即一个并不意味着另一个)。

如果只能选择一个,我宁愿选择循环初始化声明。当然,我可以使用GNU99,但这不是重点。默认情况是GNU89,它已经违反了一些C89规则(也允许BCPL/C++风格的注释)。混合声明为什么被允许但是循环初始化声明不能呢?是否有某些根本原因?


2
原因主要是历史原因 - 只需选择您想要使用的标准,并且不会破坏您的代码库。 - Paul R
@PaulR,我无法控制SO上的标准OP选择。C和OpenMP中最大的错误源是内部循环的竞争条件,其中循环迭代没有被设为私有(上周一天就出现了两个这样的错误)。这比SSE的错误更常见。如果循环初始声明允许使用最常见的C标准(GNU89),这些错误将消失。 - Z boson
好的,我想你运气不太好。就默认编译器选项而言,如果我能挥一下魔法棒并改变一件事,那就是让-Wall成为gcc的默认选项 - 这可能会在一夜之间减少一半的初学者C/C++问题在SO上的提问。;-) - Paul R
1
谨记@PaulR,我以后会使用“-Wall” :-) - Z boson
1个回答

6

在其他语言(例如Algol 68)中,混合声明和语句早在C89之前就已经存在,并且是一些C89编译器(而不是MSCV)的常见扩展。

另一方面,在C ++ 98中引入了for语句中的计数器变量声明,并且据我所知,没有C89编译器认为它足够有用以将其添加为C89扩展。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接