为什么我在const int上获得用于指定数组大小的不同编译器行为?

时间:2017-03-06 23:17:34

标签: c arrays

我有以下代码:

static const int constant_int_value = 10;
static int my_array[constant_int_value];

int main(void)
{
  my_array[0] = 10;
}

clang发出警告,但编译它:

clang -Weverything -std=c11 array_index.c  
array_index.c:4:20: warning: variable length array used [-Wvla] 
static int my_array[constant_int_value];
                   ^ 
array_index.c:4:12: warning: size of static array must be an integer constant expression [-Wpedantic] 
static int my_array[constant_int_value];
           ^ 
2 warnings generated.

看来我使用的是整数常量,所以我不理解这个警告。

gcc不编译代码:

gcc -Wall -Wextra -Wpedantic -std=c11 array_index.c
array_index.c:4:12: error: variably modified ‘my_array’ at file scope
 static int my_array[constant_int_value];

1 个答案:

答案 0 :(得分:3)

即使constant_int_value限定符和静态存储持续时间,const也不是常量表达式。您可以将其定义为枚举常量:

enum { constant_int_value = 10 }; // now, it is constant expression

当它作为数组大小放置时,编译器假定它是VLA。但是,在文件范围内不允许使用VLA(我认为它违反了约束条款),因此您会收到警告或错误。

相关问题