6

最近、MSVC++2008と比較したときにg++の興味深い動作を発見しました。この小さなプログラムについて考えてみましょう。

#include <cstdlib>

const int ARR_LENGTH = 512;

void doSomething( int iLen );

int main( int argc, char** argv )
{
    doSomething( ARR_LENGTH );
    return 0;
}

void doSomething( int iLen )
{
    int iTest[iLen];
    return;
}

コンパイルされますか?どう思いますか?私のC(またはC ++)の知識によると、これはコンパイルしないでください。任意の整数で関数doSomething()を呼び出すことができるため、コンパイル時にiTest配列のサイズを決定できません。ただし、これをg ++でコンパイルしようとすると、問題なく動作します。これで、おそらくここで何が起こったのかを理解できます。コンパイラは、コンパイル時定数をパラメータとして渡したときに1回だけこの関数を呼び出すことに気づきました。ここでいくつかの深刻な最適化が行われています...しかし、MSVC ++ 2008を使用してこれをコンパイルしようとすると、次のようになります。

1>c:\prj\test\test.cpp(15) : error C2057: expected constant expression
1>c:\prj\test\test.cpp(15) : error C2466: cannot allocate an array of constant size 0
1>c:\prj\test\test.cpp(15) : error C2133: 'iTest' : unknown size

私の質問は、これが言語の定義(C標準(C ++標準))にどのように準拠しているかということです。g ++がそのような最適化を行うのは問題ありません(この場合は簡単に確認できますが、初めて遭遇したときは大規模なプロジェクトであり、一見しただけではあまり意味がありませんでした)。

4

3 に答える 3

5

C99(C標準の最新バージョン)では、動的なサイズの配列を使用できます。ただし、この機能はVisual Studio(C89サポートのみを実装)ではサポートされていません。

C ++では、有効ではなく、おそらく有効になることはありません。

于 2010-06-22T12:31:48.237 に答える
2

動的なサイズの配列はC99の機能です。コンパイラがC99をサポートしている場合(GCCはサポートしていますが、VCは完全にはサポートしていません)、C99スイッチをスローすると、コンパイルされます。

于 2010-06-22T12:32:08.640 に答える
0

これは標準のC++ではありません(標準のCです)。実装は、ほとんど仕事をするalloca(またはmsvcを使用した_alloca)を提供する場合があります。

于 2010-06-22T12:42:26.293 に答える