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

Why should global array size be an integer constant?

在 C++ 中,我尝试声明一个具有一定大小的全局数组。我收到错误:

array bound is not an integer constant before ‘]’ token

但是当我在 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" 重复。但是这个问题并没有回答为什么会有不同的行为。

数组的大小必须是常量。您可以通过将 y 声明为 const.

来解决此问题
const int y=5;
int arr[y]; 

至于为什么这在 main 中有效,g++ 确实允许在块作用域中使用可变长度数组作为扩展。然而,它不是标准的 C++。

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

Why there is a different behaviour here?

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

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

两者都不应该使用,一个有效,因为(正如@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 数组的定义中使用的内容施加了一些限制。 IE。这个数字需要静态存储,需要不可变并且需要在编译时可用.

因此,您可能希望将代码更改为类似以下内容,这将有另一个好处。它以正确的方式初始化数组:

int arr2[] = {0, 0, 0, 0, 0};