代码之家  ›  专栏  ›  技术社区  ›  sancho.s ReinstateMonicaCellio

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

  •  2
  • sancho.s ReinstateMonicaCellio  · 技术社区  · 8 年前

    #include <iostream>
    
    int main() {
        int nv;
        nv = 3;
        int arr[nv] = { 0, 2, 5 };
        return 0;
    }
    

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

    在system2上使用GCC编译时,我没有发现任何错误。

    编译标志在这两种情况下是相同的,请参见下文。

    原因是什么?我怎样才能让我的代码在system1中编译? 我怀疑它与gcc版本有关,但我没有发现支持这种怀疑的信息。

    $ 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
    ...
    

    $ 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
    ...
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   MSalters    8 年前

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

    第一个扩展,如已经指出的,是在C++中使用C99 VLA的。那是个好主意 documented GCC extension .

    第二个扩展是,即使C99也不允许VLA的初始值设定项:

    C99§6.7.8[初始化]

    大小或对象类型 类型。

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