我有以下代码:
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];
答案 0 :(得分:3)
即使constant_int_value
限定符和静态存储持续时间,const
也不是常量表达式。您可以将其定义为枚举常量:
enum { constant_int_value = 10 }; // now, it is constant expression
当它作为数组大小放置时,编译器假定它是VLA。但是,在文件范围内不允许使用VLA(我认为它违反了约束条款),因此您会收到警告或错误。