可能无法初始化C ++可变大小的对象

问题描述 投票:2回答:1

我有以下简单的来源

#include <iostream>

int main() {
    int nv;
    nv = 3;
    int arr[nv] = { 0, 2, 5 };
    return 0;
}

在系统1上使用GCC进行编译时,我得到了

error: variable-sized object ‘arr’ may not be initialized.

在系统2上使用GCC进行编译时,我没有错误。

两种情况下的编译标志都相同,见下文。

这是什么原因,我怎样才能让我的代码在系统1中编译?我怀疑它与gcc版本有关,但我没有找到任何信息来支持这种怀疑。

在系统1中:

$ g++ --version
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
...
$ make
g++ -MMD -g -g3 -Wall -Wunused -Wuninitialized -Wextra -fmessage-length=0 -std=gnu++11 -c -o obj/arrays_test.o src/arrays_test.cc
...

在系统2中:

$ g++ --version
g++ (Ubuntu 5.5.0-12ubuntu1~16.04) 5.5.0 20171010
...
$ make
g++ -MMD -g -g3 -Wall -Wunused -Wuninitialized -Wextra -fmessage-length=0 -std=gnu++11 -c -o obj/arrays_test.o src/arrays_test.cc
...
c++ arrays initialization g++ variable-length-array
1个回答
1
投票

这里的问题是你使用的不是一个而是两个扩展。

如前所述,第一个扩展是您在C ++中使用C99 VLA。这是一个documented GCC extension

第二个扩展是即使C99也不允许VLA的初始化器:

C99§6.7.8[初始化]

要初始化的实体的类型应该是未知大小的数组或不是可变长度数组类型的对象类型。

(在C11中,您将在§6.7.9中找到此限制)。但是,正如链接的GCC页面所示,这不是官方的Gnu扩展。 C99的限制仍然存在。您需要使用赋值而不是初始化。

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