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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可能无法初始化C ++可变大小的对象相关的知识,希望对你有一定的参考价值。

我有以下简单的来源

#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 ++中使用C99 VLA。这是一个documented GCC extension

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

C99§6.7.8[初始化]

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

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

以上是关于可能无法初始化C ++可变大小的对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 memset 防止“可变大小的对象可能未初始化”

简单的 c malloc

变量初始化错误c ++

java-并发-不可变对象

序列化的方式都有哪些

NSArray 大小和可变性