如果C99解除了“块顶部的变量声明”约束,为什么在“for循环”中显示错误呢?

时间:2013-05-21 07:20:34

标签: c for-loop c99 variable-declaration

我从一个网站上读到C99解除了限制,即C中的变量必须在块的顶部声明。我在下面的程序中测试过,确实如此,因为我没有错误。但是在同一个程序中,如果我在for循环的第一个语句中声明一个变量,我会得到错误:

'for' loop initial declarations are only allowed in C99 mode|

这里有两件事。确实允许在程序中间声明变量,就像我为i所做的那样,为什么我不允许在for循环语句中执行此操作?第二,如果我的编译器(Codeblocks / gcc)已经没有处于C99模式,那么当我在中间而不是顶部声明变量时,为什么我没有收到错误?

#include <stdio.h>

int main (void)
{
  //Proof that initialization in middle works (for i)
  printf("Enter\n");
  char string[20];
  scanf("%s", string);
  int i=20;
  printf("%s,%i", string, i);
  //Proved that it works

  for(int j=0; j<10; j++) //THIS IS NOT ALLOWED
    printf("%d\n", j);
}

2 个答案:

答案 0 :(得分:5)

默认情况下,gcc使用自己的“dialect”编译代码,这是C89的扩展。对于新代码而言,这可能是一个好主意,特别是现在学习C的任何人都可以传递给更现代和标准化的语言版本。不幸的是,他们对C11的实现尚未完成,所以你必须使用-std=c99暂时坚持使用C99。

gcc online documentation提供有关他们实施的不同C方言的信息。

另一个编译器可能是clang,默认情况下是C99。根据我的经验,它通常更适合初学者,因为诊断比gcc更加用户友好。

答案 1 :(得分:3)

您使用gcc:默认情况下启用某些gcc特定扩展。试试:

[igmar@devel ~]$ gcc -std=c89 -pedantic -o xxx xxx.c
xxx.c: In function 'main':
xxx.c:6: warning: ISO C90 forbids mixed declarations and code
xxx.c:8: warning: ISO C90 forbids mixed declarations and code

-pedantic禁用非标准gcc扩展。