void foo(const int size) {
char array[size];
}
int main() { }
上面的代码在Visual Studio C++中抛出编译器错误:
error C2131: expression did not evaluate to a constant
note: failure was caused by a read of a variable outside its lifetime
为什么即使size
声明为const int
,它也没有被评估为常量?
但以下代码编译成功:
int main() {
const int size{ 10 };
char array[size];
}
这之所以编译,是因为大小确实是恒定的。
int main() {
const int size{ 10 };
char array[size];
}
但是,这不会编译,因为大小是一个常量变量,而不是编译时常量(有一个细微的区别(
void foo(const int size) {
char array[size];
}
它不起作用的原因是因为我可以用不同的参数调用 foo。
foo(10);
foo(42);
foo(1);
最简单的解决方法是使用 std::vector,这就是您正在尝试做的......
void foo(const int size) {
std::vector<char> array(size);
}
现在,"数组"将以与原始代码相同的意图工作。
C++是一种静态类型语言,char array[1]
和char array[2]
是不同的类型,因此必须在编译时知道这些类型。
例如
void foo(const int size) {
char array[size];
}
int main() {
int x = std::rand() % 1000;
foo( x ); // Error
}
在这种情况下,编译器无法在编译时知道char array[size]
的类型,因为大小是在运行时决定的,因此这是一个错误。
因此,@Frodyne注释中所述,静态数组的大小必须是常量表达式
数组的大小需要是一个编译时常量,而不仅仅是运行时const
。
由于常量变量大小初始化为"10",因此无法修改大小的值。数组的大小是固定的,无法更改。
int size = 10;//可以更改大小的值。