C++ 平凡C++;代码。。。为什么要编译?

C++ 平凡C++;代码。。。为什么要编译?,c++,arrays,C++,Arrays,像这样的C++教程说,所有数组的大小必须在程序运行之前确定。例如,这是不允许的: cout << "How many variables do you want? "; int nVars; cin >> nVars; int anArray[nVars]; // wrong! The size of the array must be a constant cout>nVars; 国际航空公司[nVars];//错了!数组的大小必须是常量 但这个微不足道的程序编

像这样的C++教程说,所有数组的大小必须在程序运行之前确定。例如,这是不允许的:

cout << "How many variables do you want? ";
int nVars;
cin >> nVars;

int anArray[nVars]; // wrong!  The size of the array must be a constant
cout>nVars;
国际航空公司[nVars];//错了!数组的大小必须是常量

但这个微不足道的程序编译和执行得很好。应该是?

这是C++编译器实现的一个通用扩展,比如GNU的G++。使用
-std=c++0x
标志编译,以将此类声明视为错误。

一些编译器包括并支持可变长度数组作为扩展,即使这实际上是C99的一项功能

如果在使用
gcc
clang
进行构建时使用
-pedantic
参数,则两者都将发出类似于以下内容的警告:

warning: variable length arrays are a C99 feature [-Wvla-extension]

<标准> C++中的GCC/G++和(我相信)MSVC都不支持这种可变长度数组的扩展。但是,您可以配置一些选项来禁用扩展,在这种情况下,代码将无法编译


在g++中,如果使用
-pedantic

现代C/C++编译器允许使用变量定义数组大小,它将无法编译。结果与使用alloca()相同。
这现在不是标准的,但是gcc会这样做,关于另一个-需要检查。

它会编译,但是(至少在gcc 4.8上)它会触发。谢谢。那么它是存储在堆栈上还是存储在堆上?@user2432701数组在堆栈上。编译器使用一些技巧来了解大小。@user2432701它们通常在堆栈上实现,这是许多与参数类似的核心原因之一。感谢您的帮助。如果我从命令行运行-pedantic,那么它会报告一个错误。但在代码块中,如果我选中-pedantic,它不会。你知道为什么吗?编辑:我已经找到了解决方案,以防其他读者也有同样的问题。在代码块中,您不能只点击“build”——但实际上您需要点击“rebuild”。