我从一个网站上读到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);
}
答案 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扩展。