这可行:
const int size = 2;
int array[size] = {0};
这有编译错误:
int a = 2;
const int size = a;
int array[size] = {0};
为什么?
答案 0 :(得分:8)
因为C ++委员会的成员决定如此。
技术原因是用于初始化size
的第一个表达式是一个常量表达式,它可以在编译期间计算。这意味着编译器也可以知道数组的大小,并且可以在编译时完成分配(在本例中“预留”可能是更合适的术语)。
在第二种情况下,表达式不是常量表达式(给定C ++定义),并且无法进行此重新保存。
在第二种情况下,值被size
初始化时确实固定的事实完全无关紧要。规则基于“表达式”,第二个表达式使用可变变量,因此编译器认为它是非常量的。
允许第二种形式进行编译时初始化需要进行流分析,因为它需要区分
int a = 2;
const int size = a;
和
int a = foo();
const int size = a;
其中涉及size
的表达式确实相同。
答案 1 :(得分:5)
const int size = 2;
int array[size] = {0};
这里,2
是一个文字值,这意味着你不能改变它,编译器在编译时知道这个值。
int a = 2;
const int size = a;
int array[size] = {0};
但是,a
是一个变量,这意味着值a
可以更改,并且可以在运行时确定。所以编译器禁止你。
你可以使用
int a = 2;
int size = a;
int* array = new int[size];
因此,您可以申请动态大小的数组。
答案 2 :(得分:2)
这是关于记忆管理的。
当OS因为C ++的性质而试图运行你的程序时,OS会想知道 stack 区域的确切空间。在第一个例子中,操作系统会知道变量的值不会改变。但是对于OS的第二个例子,你的第一个变量“a”可以在
之间改变int a = 2;
这个和这个
const int size = a;
你的变量a可以改变。这就是你的编译器不允许你编译代码的原因。
了解有关内存管理基础知识的更多信息。我建议你 https://stackoverflow.com/a/24922/2326288此评论。
答案 3 :(得分:0)
因为在第一种情况下,编译器在编译时初始化size
。在第二种情况下,{em} 编译时常量。