在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 ++中都是错误的形式。如果编译器没有诊断出后者,则它不符合标准。
为什么这里有不同的行为?
您使用的语言扩展名允许运行时长度自动数组。但是不允许运行时长度为静态的数组。全局数组具有静态存储。
如果使用的是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;
}