1

我从一个站点读到 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);
}
4

2 回答 2

5

默认情况下,gcc 使用自己的“方言”编译代码,这是 C89 的扩展。对于新代码,尤其是现在学习 C 的任何人来说,传递到更现代和更标准化的语言版本可能是一个好主意。不幸的是,他们对 C11 的实现还没有完成,所以你现在必须坚持使用 C99,使用-std=c99.

gcc在线文档包含有关它们实现的不同 C 方言的信息。

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

于 2013-05-21T08:42:54.247 回答
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 扩展。

于 2013-05-21T07:31:25.263 回答