为什么这种类型的声明
int nArraySize = 7;
char szName[nArraySize] = "Mollie";
返回此错误:
error: variable-sized object 'szName' may not be initialized
但是当我将'arraySize'变量声明为'const int'时它可以工作吗?
const int nArraySize = 7;
char szName[nArraySize] = "Mollie";
首先必须要说的是,在C++语言中,数组声明的大小部分需要是一个整型常量表达式(ICE)。用初始化器声明的const int
对象可以在 ICE 中使用。int
不能在 ICE 中使用对象。这是它的正式部分。
但是,从错误消息来看,您的 C++ 编译器支持C++中的 C99 样式的可变长度数组 (VLA),作为非标准扩展。这意味着在您的编译器中,您可以使用非常量表达式来指定数组声明中的大小。然而,即使支持 VLA 本身,这些数组仍然无法初始化。C99 中的 VLA 规范禁止这样做,而这正是 C++ 编译器“继承”它们的规范的方式。
换句话说,与其他答案所述相反,您的 C++ 编译器可能会接受此代码
int nArraySize = 7;
char szName[nArraySize];
即使它在形式上是非法的 C++。它是= "Mollie"
触发错误的部分。
该标准不允许动态大小、静态分配的数组。您可能会发现在 GCC 中您将能够做到这一点,但那是因为这是许多允许不一致行为的扩展之一。
数组定义如下:
D1 [ constant-expression
opt
] attribute-specifier-seq
opt
其中大小是一个整数常量表达式。标准定义了一个整数常量表达式,如下所示:
整型常量表达式是整型或无范围枚举类型的表达式,隐式转换为纯右值,其中转换后的表达式是核心常量表达式。[注:此类表达式可用作数组边界(8.3.4、5.3.4),[...] — 结束注]
int n = 10;
int x[n]; // error!
该变量n
不是常量表达式,因此它不适用于这种情况。
通过将constexpr
(C++11) 添加到类型中,它将可用于常量表达式。但在这种情况下const
足以让它工作:
int const n = 5;
int x[n];
另一方面,动态数组采用动态大小说明符:
int n = 10;
int *x = new int[n];
但我建议使用的一个选项是std::vector
动态大小缓冲区的包装器:
#include <vector>
int main()
{
int n = 10;
std::vector<int> x(n); // x.size() is 10
}
我希望这会有所帮助。
第一个是可变长度数组,它在 C 中标准化(从 C99 标准开始),但在 C++ 中没有。
C++ 需要所有数组的大小在编译时可用,而不是运行时可用。将大小声明为常量使其成为编译时常量。
因为程序必须在编译时知道为变量分配多少内存。如果您不设置nArraySize
常量,则假定它可能会在运行时发生变化。将其设为常量可确保编译器不会更改此值。