【问题标题】:Why is an array with const length considered to be a variable-sized object by the compiler?为什么编译器将具有 const 长度的数组视为可变大小的对象?
【发布时间】:2016-04-25 08:27:44
【问题描述】:

在 C 中,不能初始化可变大小的数组,即,

int size = 3;
int array[size] = {1, 2, 3}; /* error: variable-sized object may not be initialized */

我们可以将size 定义为预处理器宏以使其工作:

#define size (3)
int array[size] = {1, 2, 3}; /* works */

我更喜欢使用常量而不是宏,所以我想做:

const int size = 3;
int array[size] = {1, 2, 3}; /* error: variable-sized object may not be initialized */

问题:为什么最后一个变体不起作用?如果const 告诉编译器我无意修改变量,为什么它不推断出数组不是可变大小的?

我也尝试将size设为静态,但无济于事:

static const int size = 3;
int array[size] = {1, 2, 3}; /* error: variable-sized object may not be initialized */

注意:我知道我可以这样做

int array[] = {1, 2, 3};

但是,size 稍后用于迭代数组,因此如果size 与数组的实际大小不匹配,我希望编译器发出警告。

【问题讨论】:

  • 这不是标准的 C89 结构,是吗?编译器是什么?
  • 您指的是哪个构造?一切都使用 gcc-3.4.4 和 std=C89 编译(带有指示的错误)(除了 //-style cmets,我修复了)
  • "在 ISO C99 中允许使用可变长度自动数组,作为扩展,GCC 在 C90 模式和 C++ 中接受它们。"
  • 你可以在C89中使用int array[] = {1, 2, 3}; int size = sizeof(array)/sizeof(int);
  • 没错,虽然sizeof(array)/sizeof(array[0]) 可能更好。

标签: arrays initialization constants c89


【解决方案1】:

我发现为什么const intconst static int 类型的变量都不能用于声明数组:数组大小需要是一个常量表达式。在 C 中,常量表达式类似于文字常量或 sizeof 表达式(后者仅自 C99 起),但不是 const 变量。奇怪的是,在 C++ 中,const 变量是一个常量表达式,可以用来声明一个数组。

【讨论】:

    【解决方案2】:

    Gcc documentation

    在声明时分配存储空间

    用于可变大小的数组。

    对于要初始化的数组,必须在编译时分配其存储空间。

    优化器将 const 变量转换为常量。但是为了优化程序,首先需要它是有效的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-06
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 2021-08-03
      • 1970-01-01
      • 2019-02-01
      相关资源
      最近更新 更多