2017-02-15 20 views
7

私が理解しているように、const char argv[SIZE];のような配列を定義すると、 "SIZE"はコンパイル時に知られている数値でなければなりません。不確定なサイズの配列を定義する

しかし、最近、私はAOSPコードを読んで、これを見つけた:http://androidxref.com/5.1.1_r6/xref/system/netd/server/NetdConstants.cpp#70

static int execIptables(IptablesTarget target, bool silent, va_list args) { 
    /* Read arguments from incoming va_list; we expect the list to be NULL terminated. */ 
    std::list<const char*> argsList; 
    argsList.push_back(NULL); 
    const char* arg; 
    do { 
     arg = va_arg(args, const char *); 
     argsList.push_back(arg); 
    } while (arg); 

    int i = 0; 
    const char* argv[argsList.size()]; 
    ... 

const char* argv[argsList.size()];は、実行時にのみ知られているサイズを使用しているようです。これは、この配列がスタックに配列を割り当てる関数で定義されているか、またはコンパイラがコンパイル時のサイズを把握できるためですか?

+0

一部のコンパイラは、実行時にのみ判明しているサイズのスタック上の配列を(拡張子として)サポートしています。 – BoBTFish

+1

著者は、このコードを構築しているC++コンパイラがサポートしている非標準機能(可変長配列、VLA)を期待しています。 – WhozCraig

+3

varargsを蓄積するために使用される 'std :: list'は、次にVLAを作成し、そこにすべてをコピーするために使用されますか?誰がこのゴミを書きましたか?私はもうこの電話を使いたくない... –

答えて

0

正しい用語は可変長配列(VLA)です。

C++言語標準はこの機能をサポートしていません。

C言語標準は、ある時点でサポートを開始しました。

メモリ内の割り当ては、コンパイラに依存します(つまり、標準では規定されていません)。

+0

標準C++でサポートされていなくても、gccとclangの両方でサポートされている共通の拡張機能です。 –

+0

@MatteoItalia:OK、良い点。もちろん私は一般的な基準に言及していました。あなたのコメントは私のためにこれを行います。なぜなら、他のC++コンパイラがこれをサポートしているかどうかわからないからです。ありがとうございます:) –

+0

Gccとclangですが、* MSVCではありません - ターゲットプラットフォームに応じて問題となる可能性があります。 –

関連する問題