数组定义 - 表达式必须具有常量值

时间:2014-06-16 13:41:57

标签: c

我在堆栈上创建一个数组

static const int size = 10;

void foo() {
..
int array[size];
..
}

但是,我得到编译错误:“表达式必须具有常量值”,即使size是常量。我可以使用宏

#define SIZE (10)

但我想知道为什么size标记const会导致编译错误。

3 个答案:

答案 0 :(得分:19)

在C语言中,关键字const常量无关。在C语言中,根据定义,术语"常数"指文字值和枚举常量。如果你真的需要常量,那么你必须使用这个:要么使用文字值(定义一个宏来给你的常量命名),要么使用枚举常量。

(请阅读此处了解更多详情:Shall I prefer constants over defines?

此外,在C99及更高版本的语言中,可以将非常量值用作本地数组的数组大小。这意味着即使您的size不是常量,您的代码也应该在现代C中编译。但是你显然使用的是较旧的编译器,所以在你的情况下

#define SIZE 10

是正确的方法。

答案 1 :(得分:4)

答案是另一个stackoverflow问题,HERE

  

它是因为使用const修饰符声明的C对象不是真的   常量。 const的一个更好的名字可能只是readonly - 什么   它的确意味着编译器不会让你改变它。你呢   需要使用true常量来初始化具有静态存储的对象(I   怀疑regs_to_read是全球的。)

答案 2 :(得分:0)

如果您使用的是C99,则您的IDE编译器选项可能启用了一个称为可变长度数组(VLA)的东西,并且即使使用MALLOC或CALLOC,也不会得到编译错误,而不会对代码造成压力。

静态const int大小= 10;

void foo(){ .. int *数组; 数组=(int *)malloc(size * sizeof(int)); .. }