C++ 为什么我可以将数组的大小设置为向量的(未知)大小?

C++ 为什么我可以将数组的大小设置为向量的(未知)大小?,c++,arrays,vector,C++,Arrays,Vector,关于堆栈溢出,我的第一个问题是: 我正在做C++程序,在那里发生的事情我认为是行不通的。我的同事正在建立一个向量myvec,它包含我们正在使用的某个类的元素。它的大小由用户在调用程序时选择,因此在编译时它不是固定的!尽管如此,该准则仍包括以下有效的声明: const unsigned myNumber = myvec.size(); bool valid_PDFplot[myNumber]; 我一直认为,除非在new中使用动态分配的内存,否则无法定义编译时未知大小的数组?如上所

关于堆栈溢出,我的第一个问题是:

我正在做C++程序,在那里发生的事情我认为是行不通的。我的同事正在建立一个向量
myvec
,它包含我们正在使用的某个类的元素。它的大小由用户在调用程序时选择,因此在编译时它不是固定的!尽管如此,该准则仍包括以下有效的声明:

    const unsigned myNumber = myvec.size();
    bool valid_PDFplot[myNumber];

我一直认为,除非在
new
中使用动态分配的内存,否则无法定义编译时未知大小的数组?如上所述,向量的大小不是在编译时设置的,因为用户可以使用
push\u back
添加任意数量的元素。为什么上面显示的代码仍在工作?

这是可以接受的,因为编译器实现了可变长度数组作为扩展。(VLAs在1999中被引入标准C,在2011中被选择了。它们从未被添加到标准C++中)

如果您使用的是gcc,
-pedantic
编译器选项将导致它拒绝声明

c.cpp: In function 'int main()':
c.cpp:6:32: warning: ISO C++ forbids variable length array 'valid_PDFplot' [-Wvla]
     bool valid_PDFplot[myNumber];

它被接受是因为编译器实现了可变长度数组作为扩展。(VLAs在1999中被引入标准C,在2011中被选择了。它们从未被添加到标准C++中)

如果您使用的是gcc,
-pedantic
编译器选项将导致它拒绝声明

c.cpp: In function 'int main()':
c.cpp:6:32: warning: ISO C++ forbids variable length array 'valid_PDFplot' [-Wvla]
     bool valid_PDFplot[myNumber];

这是对C++编译器的扩展,它支持多个编译器,而其他编译器则不涉及C++,它是几个编译器支持的扩展,而其他编译器则不涉及到谢谢,这正是我一直在寻找的答案。如果我使用这个“特性”,它是否被认为是坏的风格?@ DrauneLaund:它不是可移植的,所以您的代码可能无法与另一个C++编译器编译。作为样式的问题,如果你需要C++中的可变长度数组,你可能应该使用<代码> STD::vector < /C> >,或者可能是其他容器类。谢谢,这正是我一直在寻找的答案。如果我使用这个“特性”,它是否被认为是坏的风格?@ DrauneLaund:它不是可移植的,所以您的代码可能无法与另一个C++编译器编译。作为样式的问题,如果您需要C++中的可变长度数组,则可能应该使用<代码> STD::vector < /C> >,或者可能是其他容器类。