簡體   English   中英

C ++可變大小的對象可能未初始化

[英]C++ variable-sized object may not be initialized

我有以下簡單的來源

#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。 那是文件化的GCC擴展名

第二個擴展是,即使C99也不允許VLA的初始化程序:

C99§6.7.8[初始化]

要初始化的實體的類型應為未知大小的數組或不是可變長度數組類型的對象類型。

(在C11中,您會在第6.7.9節中找到此限制)。 但是,正如鏈接的GCC頁面所示,這不是Gnu的正式擴展名。 C99限制仍然有效。 您將需要使用分配而不是初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM