gpt4 book ai didi

c - struct 中间的可变长度数组 - 为什么此 C 代码对 gcc 有效

转载 作者:太空狗 更新时间:2023-10-29 16:26:13 26 4
gpt4 key购买 nike

有一些使用 VLA(可变长度数组)的奇怪代码,它被 gcc 4.6 视为有效 C(C99、C11):

$ cat a.c
int main(int argc,char**argv)
{
struct args_t{
int a;
int params[argc]; // << Wat?
// VLA in the middle of some struct, between other fields
int b;
} args;

args.b=0;

for(args.a=0;args.a<argc;args.a++)
{
args.params[args.a]=argv[0][0];
args.b++;
}
return args.b;
}

此代码在没有警告的情况下编译:

$ gcc-4.6 -Wall -std=c99 a.c && echo $?
0
$ ./a.out ; echo $?
1
$ ./a.out 2; echo $?
2
$ ./a.out 2 3; echo $?
3

-std=c1x 相同:

$ gcc-4.6 -Wall -std=c1x a.c && echo $?
0

但这不适用于英特尔 C 编译器或 Clang+LLVM:

$ icc a.c -o a.icc
a.c(5): warning #1361: variable-length array field type will be treated as zero-length array field type
int params[argc];
^
$ ./a.icc; echo $?
47

$ clang a.c -o a.clang
a.c:5:10: error: fields must have a constant size: 'variable length array in structure' extension will never be supported
int params[argc];
^
1 error generated.

所以:

  1. 为什么 GCC 认为这是有效的?
  2. 如果它是 GCC 的扩展,它在哪里描述?
  3. 它在 C99 和 C11 ISO 标准中有效吗?

最佳答案

GCC 不允许,使用 -std=c99 -pedantic-errors 编译。结构中的 VLA 显然是一个(记录不详的)非标准 GNU C 功能。 See this .

关于c - struct 中间的可变长度数组 - 为什么此 C 代码对 gcc 有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14629504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com