最近、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 ++がそのような最適化を行うのは問題ありません(この場合は簡単に確認できますが、初めて遭遇したときは大規模なプロジェクトであり、一見しただけではあまり意味がありませんでした)。