c-为什么这些数组声明(C89-C90)没有编译错误



我想表明,数组不能用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可能是所有编译器中标准遵从性最好的。

相关内容

  • 没有找到相关文章

最新更新