为什么全局数组大小应该是一个整数常量



在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};   

最新更新