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