2017-03-06 63 views
1

我有以下代码:为什么我在用const指定数组大小的const int上获得不同的编译器行为?

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

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

铛发出警告,但编译它:

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

仅仅因为你使用const不会使它成为一个常量。奇怪,我知道。使用'#define constant_int_value 10' – Gab

回答

3

constant_int_value不是恒定的表达,即使const限定符和静态存储持续时间。你可能已经把它定义为枚举常数:

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

当它被放置为阵列尺寸,编译器假定,这是VLA。但是,VLA不允许在文件范围(我相信它违反了约束),因此您会收到警告或错误。

相关问题