我想表明,数组不能用C89或C90中的长度变量来定义。
我从TDM GCC:在Windows上使用GCC
C:TDM-GCC-64bin> .gcc.exe --version
gcc.exe (tdm64-1) 10.3.0
我的编译选项包括:gcc.exe -Wall -g -ansi -save-temps -c
我试过了:
int main()
{
int i;
int tab[i];
tab[0] = 10;
return 0;
}
但它编译得很好:
gcc.exe -Wall -g -ansi -save-temps -c main.c -o main.o
gcc.exe -o Sandbox.exe main.o
main.c:6:9: warning: variable 'tab' set but not used [-Wunused-but-set-variable]
6 | int tab[i];
| ^~~
main.c:6:5: warning: 'i' is used uninitialized in this function [-Wuninitialized]
6 | int tab[i];
| ^~~
Output file is binDebugSandbox.exe with size 196.89 KB
然后:
int test(int i)
{
int tab[i];
tab[0] = 10;
return 0;
}
也编译:
main.c: In function 'test':
main.c:5:9: warning: variable 'tab' set but not used [-Wunused-but-set-variable]
5 | int tab[i];
| ^~~
Output file is binDebugSandbox.exe with size 196.90 KB
或者:
int main()
{
volatile int i;
int tab[i];
tab[0] = 10;
return 0;
}
只是这不是在编译:
int main()
{
// Comment
return 0;
}
error: C++ style comments are not allowed in ISO C90
我错过了什么?谢谢
可变长度数组是旧标准版本中的GCC扩展。扩展是";兼容的";符合标准。如果您希望完全遵守标准,即希望在使用扩展时收到消息,请添加-pedantic
选项(错误时添加-pedantic-errors
(。
Gcc文档:https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Variable-Length.html#Variable-长度,https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Warning-Options.html#Warning-选项。
gcc默认情况下标准遵从性较差。它默认为lax C一致性+GNU扩展,相当于-std=gnu89
(当前版本默认为-std=gnu17
(。
当您键入-ansi
时,并不意味着符合模式,而是与-std=c89
完全相同,";lax C89模式";。此编译器选项可能会禁用某些GNU扩展。。。大概同时保留其他人。CCD_ 8和CCD_ 9之间的差异与gcc的其余部分一样缺乏文献记载。我们可以阅读不友好的手册,上面写着:
例如,-std=c90关闭GCC的某些与ISO c90不兼容的功能,例如关键字的asm和typeof,但不关闭其他在ISO c90 中没有意义的GNU扩展
gcc甚至在C99之前就支持可变长度数组作为扩展,所以关闭GNU选项应该会禁用它们,但不是这样……据我所知,-std=c89
关闭了哪些功能,没有官方文档,或者至少我找不到。
重要的是要认识到,-std=c89
/-ansi
单独并不能将gcc推入一致性模式!要做到这一点,你需要做-std=c89 -pedantic
,或者如果你想做-std=c89 -pedantic-errors
。之后你会得到这样的诊断:
错误:ISO C90禁止可变长度数组"tab">
当结合使用这两个选项进行编译时,gcc可能是所有编译器中标准遵从性最好的。