3

この有効な構文はいつからですか? (g++ 4.6.3 を使用して動作します) これに関する詳細情報を見つけるには何を検索すればよいですか (私は新規作成/削除に慣れています)?

#include <iostream>

int main(){
    size_t sz;
    std::cout<<"number?\n";
    std::cin>>sz;

    // This line
    float dynamic_arr[sz];

     //output the (uninitialized) value just to use the array.
     std::cout<<dynamic_arr[0]<<std::endl;
     return 0;
}
4

2 に答える 2

8

Varialbe 長さ配列 (VLA) は標準の C++ ではなく、コンパイラの拡張機能です。コードを移植可能にしたい場合は、使用しないでください。

-Wvla -Werrorフラグまたはを使用してコンパイルすると、-Werror=vlaコードでエラーが発生します。

エラー: 可変長配列 'dynamic_arr' が使用されています [-Werror=vla]

于 2013-02-20T20:51:47.457 に答える
1

標準 C++ は、C99 および g++ の可変長配列 (VLA) をサポートしていません。

標準 C++ では、たとえば、次のように使用できますstd::vector(コードは変更されています)。

#include <iostream>
#include <vector>

int main(){
    int sz;
    std::cout<<"number?\n";
    std::cin>>sz;

    // This line
    std::vector<double> dynamic_arr( sz );    // Initialized to zeroes.

     //output the value just to use the array.
     std::cout<<dynamic_arr[0]<<std::endl;
}

また、std::basic_string通常はtypedefsstd::stringstd::wstring.

一般的に、主な問題は上記のように動的サイズだけであり、std::vectorうまくstd::basic_string機能します。ただし、動的サイズの配列の非常に効率的なスタック割り当てを行う方法が問題になる場合があります。多くの C および C++ 実装は、そのための非標準関数allocaをサポートしていますが、残念ながら、障害の処理方法が大きく異なります。私の知る限り、そのための一般的に利用可能なライブラリ ソリューションもありません。しかし幸いなことに、私が知っている主な使用法は (前述のようallocaに多くのプラットフォームで利用可能ですが)、Windows での文字列エンコード変換であり、時間が経つにつれて関連性が低くなり、Windows プログラムはますます純粋になります。ユニコード指向。

于 2013-02-20T21:19:33.210 に答える