在C++中,我尝试声明一个一定大小的全局数组。我得到了错误:
数组绑定不是']'标记之前的整数常量
但是当我在main()
函数中声明了一个相同类型的数组时,它工作得很好。
为什么这里有不同的行为?
int y=5;
int arr[y]; //When I comment this line it works fine
int main()
{
int x=5;
int arr2[x]; // This line doesn't show any error.
}
编辑:许多人认为这个问题是Getting error的重复;数组绑定不是';]之前的整数常量';令牌";。但这个问题并不能回答为什么会有不同的行为。
这两个例子在C++中都是格式错误的。如果编译器没有诊断出后者,那么它就不符合标准。
为什么这里有不同的行为?
您使用的语言扩展允许运行时长度的自动数组。但不允许运行时长度的静态数组。全局阵列具有静态存储。
如果您正在使用GCC,您可以通过使用-pedantic命令行选项来要求它符合标准。这样做是一个好主意,以便了解可移植性问题。
数组的大小必须是常量。可以通过将y
声明为const
来解决此问题。
const int y=5;
int arr[y];
至于为什么这在main
中有效,g++确实允许在块范围中使用可变长度数组作为扩展。然而,它不是标准的C++。
两者都不应该使用,其中一种是有效的,因为(正如@eerorika所说(运行时允许使用自动长度数组,但全局数组需要有静态存储。
如果你想声明一个可变大小的数组(例如std::cin(,你可以按照:这样做
int x;
std::cin >> x;
const int n = x;
float arr[n];
但是你不能用float arr[n] = {0}
将它设置为只包含零(如果你需要添加到数组中的值,但不确定你是否设置了它(,你需要使用类似的循环
for(int i = 0; i < n; i++)
{
arr[i] = 0;
}
C++的类型系统处理这些类C数组的方式与从类型int[5]
的示例中定义arr2
的方式相同。所以,是的,数组的元素数量是类型的一部分!
这对类C数组的定义中允许使用的内容施加了一些限制。也就是说,这个数字需要有静态存储,需要不可变并且需要在编译时可用。
因此,您可能需要将代码更改为以下内容,这将有另一个好处。它以正确的方式初始化数组:
int arr2[] = {0, 0, 0, 0, 0};