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

我正在堆栈上创建一个数组

static const int size = 10; void foo() { .. int array[size]; .. } 

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

 #define SIZE (10) 

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

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

(请阅读此处了解更多详细信息: 我是否更喜欢常量而不是定义? )

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

 #define SIZE 10 

是正确的方法。

答案是在另一个stackoverflow问题, 这里

这是因为使用const修饰符声明的C对象不是真正的常量。 const的一个更好的名称可能只是readonly – 它的真正含义是编译器不会让你改变它。 并且您需要使用真常量来初始化具有静态存储的对象(我怀疑regs_to_read是全局的)。