为什么全局数组大小应该是一个整数常量?
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};
在 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};