C++ int a[n] 在 g++ 中工作,但不能在 vs2008 中工作

问题描述 投票:0回答:6

我有以下代码:

...
int n;
cin >> n;
int numbers[n];
...

它在 Mac 上使用 g++(我认为)通过 NetBeans 进行编译,而在 Windows 上则没有使用 VS2008 进行编译。为什么让它适用于每个编译器如此困难?在分配数组之前,数组的大小是已知的。

编辑:我知道

std::vector
。实际上,这是家庭作业的一部分,我在 Mac 上开始工作,然后回到家,很惊讶它在 VS2008 上不起作用。感谢所有的答案。但我仍然觉得合乎逻辑的是,如果编译器可以生成像
alloc(123)
这样的代码,其中值 123 是硬编码的,为什么它不能生成像
alloc(n)
这样的代码,从包含
 的内存地址获得 
n
 int n
什么的。默认情况下允许这样的事情似乎更合乎逻辑。

c++ arrays visual-studio-2008 g++
6个回答
16
投票

虽然数组的大小在分配之前就已知,但直到运行时才知道。 这称为可变长度数组 (VLA),是一种 C99 主义,在 g++ 中由默认启用的扩展支持。 明确地说,这不符合 C++ 98/03,因此 Visual C++ 完全有权拒绝它。

如果您确实想要运行时动态调整大小,请在堆上分配(通过 new[])。 这将在任何地方都有效,并且作为奖励,可以保护您免受堆栈溢出的影响。


12
投票

因为数组的大小必须是标准 C++ 中的编译时常量(参见 8.3.4 §1)。


12
投票

为什么不使用一些 cpp 真实的东西,比如

std::vector<int>


2
投票

类似的事情可以用

完成
 int* numbers = (int*)alloca(n * sizeof(int));  // equivalent to int numbers[n]

这不是推荐的功能,但如果仔细使用,会给出完全相同的结果。


2
投票

根据书本,数组维度应该是一个值大于或等于 1 的常量表达式。常量表达式是指整型文字常量、枚举数或整型类型的 const 对象,它们本身是从 const 表达式初始化的。直到运行时才知道其值的非常量变量不能用于指定数组的维度。

但是我使用的编译器版本允许您提到的方式。


1
投票

Visual Studio 2008 中不支持 VLA。

© www.soinside.com 2019 - 2024. All rights reserved.