ISO C90禁止可变长度阵列

Jac*_*ack 3 c variable-length-array

我正在动态计算数组的大小.就像是:

void foo(size_t limit)
{
  char buffer[limit * 14 + 1];
}
Run Code Online (Sandbox Code Playgroud)

但只是GCC编译器说:

error: ISO C90 forbids variable length array ‘buffer’
Run Code Online (Sandbox Code Playgroud)

搜索SO我发现这个答案:

C99§6.7.5.2:

如果size是一个不是整数常量表达式的表达式......每次计算它时,它的值应大于零.

所以,我做了大小限制类型变量的重新声明:

void foo(const size_t limit)
Run Code Online (Sandbox Code Playgroud)

但它继续给我警告.这是GCC的错误吗?

Chr*_*oph 10

const- 对变量进行限定并不会使它成为编译时常量(有关定义整数常量表达式,请参阅C996.6§6 ),并且在引入带C99的可变长度数组之前,数组大小需要为编译时常量.

很明显,const-qualify变量不会使它成为编译时常量,特别是在函数参数的情况下,在调用函数之前不会对其进行初始化.

我看到你的问题的以下解决方案:

  • 通过-std=c99或编译您的代码为C99-std=gnu99
  • 通过分配你的缓冲区 malloc()
  • alloca()如果可用,使用哪个是最接近C90的可变长度数组
  • 选择始终使用的最大缓冲区大小,如果给定的limit参数溢出则失败

作为旁注,即使C99允许可变长度数组,使用静态存储持续时间的整数变量的值作为具有静态存储持续时间的数组的大小仍然是非法的,无论是否 - const限定:虽然没有什么可以阻止这个原则上,如果整数变量在同一个翻译单元中初始化,则必须使用具有可见定义的特殊情况变量,这些变量的定义位于不同的翻译单元中,并且必须禁止暂定定义或需要多个编译过程作为在解析整个翻译单元之前,暂时定义的变量的初始化值是未知的.


oua*_*uah 5

const 不会在C中引入常量,而是只读变量。

#define SIZE 16
char bla[SIZE];   // not a variable length array, SIZE is a constant
Run Code Online (Sandbox Code Playgroud)

const int size 16;
char bla[size];   // C99 variable length array, size is not constant
Run Code Online (Sandbox Code Playgroud)