【发布时间】:2020-06-22 12:52:10
【问题描述】:
在 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" 重复。但这个问题并没有回答为什么会有不同的行为。
【问题讨论】:
-
即使在
main,也是不合法的,它使用VLA扩展。 -
all 数组的边界,在 C++ 中,需要有一个值,该值在编译期间是已知的。如果这样的代码,当你的编译器“接受”
main时:你正在使用编译器扩展,它允许 VLA 进行编译,即使它们不受 C++ 标准的支持。 -
不要将“没有编译器错误”与“工作正常”混淆。在这种情况下,“工作正常”意味着您的代码依赖于非标准编译器提供的扩展,即它是好的,但它不是可移植的 c++
-
为什么不将
y和x声明为const?需要修改y或x的值吗?希望不会,因为这引发了很多关于arr和arr2应该有多大的问题——尤其是对初始化顺序的表示。 (提示:它们应该是常量) -
用
--std=c++17(或者--std=c++11,如果它是一个旧的编译器)编译你的程序,编译会失败。