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

C 为什么我在用于指定数组大小的常量int上得到不同的编译器行为?,c,arrays,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 use

我有以下代码:

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];

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

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

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

仅仅因为使用const并不能使其成为常量。奇怪,我知道。使用
#定义常量整数值10