gpt4 book ai didi

C++ 可变大小对象可能未初始化

转载 作者:太空狗 更新时间:2023-10-29 22:55:24 25 4
gpt4 key购买 nike

我有以下简单的来源

#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 [Initialization]

The type of the entity to be initialized shall be an array of unknown size or an object type that is not a variable length array type.

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

关于C++ 可变大小对象可能未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52363783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com