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

问题描述 投票:5回答:3

在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 "array bound is not an integer constant before ']' token"的重复。但是这个问题不能回答为什么会有不同的行为。

c++ variable-length-array
3个回答
7
投票

两个示例在C ++中都是错误的形式。如果编译器没有诊断出后者,则它不符合标准。

为什么这里有不同的行为?

您使用的语言扩展名允许运行时长度自动数组。但是不允许运行时长度为静态的数组。全局数组具有静态存储。

如果使用的是GCC,则可以使用-pedantic命令行选项要求它符合标准。这样做是一个好主意,以便于了解可移植性问题。


3
投票

数组的大小必须为常数。您可以通过将y声明为const来解决此问题。

const int y=5;
int arr[y]; 

关于为什么它在main中起作用,g ++确实允许在块范围内使用可变长度数组作为扩展。它不是标准的C ++。


0
投票

两者都不应该使用,一种有效,因为(如@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;
}
© www.soinside.com 2019 - 2024. All rights reserved.