58

有人可以详细说明以下 gcc 错误吗?

$ gcc -o Ctutorial/temptable.out temptable.c 
temptable.c: In function ‘main’:
temptable.c:5: error: ‘for’ loop initial declaration used outside C99 mode

temptable.c:

...
/* print Fahrenheit-Celsius Table */
main()
{
    for(int i = 0; i <= 300; i += 20)
    {
        printf("F=%d C=%d\n",i, (i-32) / 9);        
    }
}

PS:我依稀记得int i应该在for循环之前声明。我应该声明,我正在寻找一个给出 C 标准历史背景的答案。

4

2 回答 2

99
for (int i = 0; ...) 

是 C99 中引入的语法。为了使用它,您必须通过将-std=c99(或某些更高版本的标准)传递给 GCC 来启用 C99 模式。C89版本是:

int i;
for (i = 0; ...)

编辑

从历史上看,C 语言总是强制程序员在块的开头声明所有变量。所以像:

{
   printf("%d", 42); 
   int c = 43;  /* <--- compile time error */

必须改写为:

{
   int c = 43;
   printf("%d", 42);

块定义为:

block := '{' declarations statements '}'

C99、C++、C# 和 Java 允许在块中的任何位置声明变量。

真正的原因(猜测)是关于在解析 C 源代码时尽快分配内部结构(如计算堆栈大小),而无需进行另一个编译器传递。

于 2009-08-17T13:08:21.430 回答
18

在 C99 之前,您必须在块的开头定义局部变量。C99 引入了 C++ 特性,可以将局部变量定义与指令混合,并且可以在forwhile控制表达式中定义变量。

于 2009-08-17T13:09:21.150 回答