ISO:IEC 9899:TC3 6.7.5.2 Array declarators -> 10 EXAMPLE 4 を読んだ後、このような便利な構造を持つコードを見たことがないのではないかと思っていました。
この簡単なサンプル コードを書いてテストしました。
int m = 9;
int foo (int iArray[m], int n);
int main(int argc, char **argv)
{
int iArray[m];
int n = 5;
iArray[n] = 555;
printf ("%d\r\n", foo (iArray, n));
return 0;
}
int foo (int iArray[m], int n)
{
int iLocalArray[n];
iLocalArray[n - 1] = iArray[n];
return iLocalArray[n - 1];
}
このコードをMSVC2010でコンパイルしようとしたら……もちろんコンパイルできませんでした。私たちが知っているように、MSVC2013 までの実際の C Microsoft コンパイラはありません。しかし、MSVC2013RC をインストールして考えたところ、MSVC2013 には実際の C99 コンパイラが含まれていると言われているので、実行する必要があります。コンパイルを開始しても、同じエラーが発生します。
1>[...].c(6): error C2057: expected constant expression
1>[...].c(6): error C2466: cannot allocate an array of constant size 0
1>[...].c(11): error C2057: expected constant expression
1>[...].c(11): error C2466: cannot allocate an array of constant size 0
1>[...].c(11): error C2133: 'iArray' : unknown size
1>[...].c(20): error C2057: expected constant expression
1>[...].c(20): error C2466: cannot allocate an array of constant size 0
1>[...].c(22): error C2057: expected constant expression
1>[...].c(22): error C2466: cannot allocate an array of constant size 0
1>[...].c(22): error C2133: 'iLocalArray' : unknown size
しかし、C99 標準を尊重する最初の Microsoft コンパイラとして発表されたコンパイラとしては、これは非常に奇妙なエラーですよね。それとも、可変長配列の使い方が間違っていて、間違った構文を使用しているだけですか?