C++ 为什么这段代码被认为是VLA,即使它使用int?

C++ 为什么这段代码被认为是VLA,即使它使用int?,c++,variables,dynamic-memory-allocation,variable-length-array,C++,Variables,Dynamic Memory Allocation,Variable Length Array,我以为我理解了VLA是什么,直到我看到这里有一个关于动态内存分配和可变长度数组之间区别的问题。因此,至少目前,我对动态内存分配没有任何问题,但我不明白的是,为什么这段代码被认为是VLA: int size = 10; // or whatever int my_array [size] ; // why this is a VLA 更神秘的是,这甚至被认为是一个VLA const int size = 10; int my_array [size]; // why even when i u

我以为我理解了VLA是什么,直到我看到这里有一个关于动态内存分配和可变长度数组之间区别的问题。因此,至少目前,我对动态内存分配没有任何问题,但我不明白的是,为什么这段代码被认为是VLA:

int size = 10; // or whatever
int my_array [size] ; // why this is a VLA
更神秘的是,这甚至被认为是一个VLA

const int size = 10;
int my_array [size];  // why even when i use a const it is a VLA .
所以,我的问题是,这两种不同的方法如何被视为VLA

据我所知,VLA只是一个数组,它的大小只有在运行时才知道,就像我提示用户输入数组的大小并将数组设置为这个大小一样,这样编译器就不可能知道数组的大小

但是,在上面的两段代码中,
大小在编译时就已经知道了,所以如果这是真的,它们是VLA,那么标准数组语法必须是这样的,而不是别的

int my_array[10];
我的另一个问题是,我听说
const int size=10
实际上不是常量,这意味着编译器不知道该大小是否为10,它将其视为变量

这样,如果有人能稍微清楚地了解C++中变量和const的区别,那就很有意思了。 注意:这是StackOverflow问题的链接。所以,如果这个问题有问题,有人可以纠正


P> >首先,C++中不存在可变长度数组。在C++中没有可变长度数组。这个答案只适用于特定的GNU编译器扩展,以支持C++中的可变长度数组。 编译器仍然知道为什么这甚至是VLA大小

问题不在于“编译器知道什么”,而在于定义。定义了术语和语言,定义了什么是VLA,什么不是VLA。可变长度数组定义为大小不是整数常量表达式的数组-
intvla[]。发件人:

如果大小是整数常量表达式,且元素类型具有已知常量大小,则数组类型不是可变长度数组类型;否则,数组类型为可变长度数组类型

什么是整型常量表达式,什么不是整型常量表达式,反过来又有一个非常确定的定义

在C语言中,两种定义都
int size=10
常量int size=10作为表达式的
大小
不是一个表达式。所以您显示的两个数组定义都是可变长度数组。结束

<>在C++中,没有整数常量表达式,最可能(我猜!)GNU编译器在VC++中工作,用VLA扩展来检查数组声明中的大小表达式是否为。在C++中,常量限定的整型可用于常量表达式,因此<代码> const int St= 10;int my_数组[大小]是一个普通数组。非常量限定的整数类型在常量表达式中不可用,因此
int size=10;int my_数组[大小]在C++中无效,在GNU编译器中,在可变长度数组中具有扩展的启用结果。
为什么这段代码被认为是VLA,即使它使用int

“使用int”不一定使表达式成为常量表达式,这是非变长数组的数组定义中括号内表达式所需的

这两种不同的方法如何被视为VLA


<> P.>对于C,数组定义中括号内的表达式必须是常量表达式,因为不是,这两个代码段导致VLA声明。

< P>首先,C++中不存在可变长度数组。在C++中没有可变长度数组。这个答案只适用于特定的GNU编译器扩展,以支持C++中的可变长度数组。 编译器仍然知道为什么这甚至是VLA大小

问题不在于“编译器知道什么”,而在于定义。定义了术语和语言,定义了什么是VLA,什么不是VLA。可变长度数组定义为大小不是整数常量表达式的数组-
intvla[]。发件人:

如果大小是整数常量表达式,且元素类型具有已知常量大小,则数组类型不是可变长度数组类型;否则,数组类型为可变长度数组类型

什么是整型常量表达式,什么不是整型常量表达式,反过来又有一个非常确定的定义

在C语言中,两种定义都
int size=10
常量int size=10作为表达式的
大小
不是一个表达式。所以您显示的两个数组定义都是可变长度数组。结束

<>在C++中,没有整数常量表达式,最可能(我猜!)GNU编译器在VC++中工作,用VLA扩展来检查数组声明中的大小表达式是否为。在C++中,常量限定的整型可用于常量表达式,因此<代码> const int St= 10;int my_数组[大小]是一个普通数组。非常量限定的整数类型在常量表达式中不可用,因此
int size=10;int my_数组[大小]在C++中无效,在GNU编译器中,在可变长度数组中具有扩展的启用结果。
为什么这段代码被认为是VLA,即使它使用int

“使用int”不一定使表达式成为常量表达式,这是非变长数组的数组定义中括号内表达式所需的

这两种不同的方法如何被视为VLA


<> P>对于数组定义中括号内的表达式必须是常量表达式,因为不是,这两个代码段导致VLA声明。< /P> C和C++是不同的语言。在C
const int size中=