【问题标题】:Array definition - Expression must have a constant value数组定义 - 表达式必须有一个常量值
【发布时间】:2014-06-16 13:41:57
【问题描述】:

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

static const int size = 10;

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

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

#define SIZE (10)

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

【问题讨论】:

  • 恐怕还不够足够稳定。请改用宏。
  • 足够恒定是什么意思?你能解释一下吗
  • 旧的编译器?需要升级吗?
  • 我可以使用宏,但想知道为什么标记为 const 的大小会导致编译错误。
  • 有你的答案HERE(编辑链接)

标签: c


【解决方案1】:

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

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

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

#define SIZE 10

是正确的方法。

【讨论】:

  • 谢谢 以为它和 C++ 一样。
【解决方案2】:

答案在另一个 stackoverflow 问题中,HERE

这是因为在 C 中使用 const 修饰符声明的对象不正确 常数。更好的 const 名称可能是 readonly - 什么 这实际上意味着编译器不会让你改变它。和你 需要真正的常量来初始化具有静态存储的对象(我 怀疑 regs_to_read 是全局的)。

【讨论】:

  • C11 支持变长数组,所以可能 OP 的编译器已经过时了。
【解决方案3】:

如果您在 C99 上,您的 IDE 编译器选项可能有一个称为可变长度数组 (VLA) 的东西启用它,并且您不会得到编译错误,虽然使用 MALLOC 或 CALLOC,但不会对您的代码造成压力。

静态常量 int 大小 = 10;

void foo() {
    int* array;
    array = (int *)malloc(size * sizeof(int));
}

【讨论】:

    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2012-07-27
    • 1970-01-01
    • 2022-08-23
    相关资源
    最近更新 更多