为什么使用const不允许变量大小的对象初始化

时间:2014-01-15 18:18:04

标签: c compiler-construction const

这是错误的,因为可能无法初始化可变大小的对象

int size = 4;
int array[size] = {1};

size是一个变量,但是编译器在创建array时不知道它的值(在编译时是不是size分配了初始值4?) ?在此之后让size改变,为什么会出现问题?我的意思是,这些是连续的指令,在声明数组之前可能会改变size的值?

第二个问题: 为什么不允许这样做:

const int size = 4;
int array[size] = {1};

我将size声明为const。我知道const!=只读,并且将size声明为宏是正确的方法。但是,如果我保证编译器使用const我不会改变size的值,为什么不允许?

1 个答案:

答案 0 :(得分:6)

第一个问题的答案是“因为语言规范是这样说的”。虽然编译器可能能够推断出数组的大小,但这样做需要一些静态分析,当数组大小不是编译时常量表达式时,这是非常简单的。

至于为什么不允许初始化VLA: I 可以想到的一个原因是,直到运行时才会知道它们将包含多少个元素,所以a VLA可能比其初始化列表更短,这将调用未定义的行为。但是我无法确定这是否是(真实的)原因之一。

  

第二个问题:为什么不允许这样做:

允许,除非你你的编译器的编写者住在一个洞穴里(例如,微软的工程师们 - 他们的C编译器是一个在标准化15年后,仍然不支持C99的广泛使用的编译器的罕见示例。任何现代的,体面的C编译器都应该允许您使用C99中存在的可变长度数组。已经实现C11的编译器可能会也可能不会选择支持VLA(因为它是最新标准的可选功能)。