0

GCC コンパイラを使用すると、関数の入力引数を使用して関数に配列サイズを動的に割り当てることができますが、Windows cl.exe コンパイラを使用してコンパイルすると同じことが失敗します。どうして。?

void func1(int array_ele)
{
    int arr[array_ele];
    for (int i=0; i<array_ele; i++)
        arr[i] = i;
    /* Rest of the code */
}

int main(int argc, char* argv[])
{
    int a = 10;
    func1(a);
    /* Rest of the code */
}
4

3 に答える 3

3

可変長配列は C99 標準で導入されましたが、Microsoft C コンパイラは最近まで C99 をサポートしておらず、そのサポートは最新の 2015 版でもまだ不完全です (たとえば、VLA はまだサポートされていません)。

バージョン 5 より前の GCC は、デフォルトで "gnu90" を使用する C 方言として使用しました。これは、GCC 拡張機能を備えた C89 標準の更新バージョンであり、これらの拡張機能の 1 つが VLA です。バージョン 5 以降のデフォルトは、GCC 拡張機能を備えた最新の C11 標準である「gnu11」です。

于 2016-04-13T05:43:02.370 に答える
3

int arr[array_ele];可変長配列宣言です。標準 C です (C99 以降)。ただし、cl.exe標準に準拠した C コンパイラではなく、Microsoft は基本的に、標準に準拠した C コンパイラを作成するつもりはないと述べています (悪意を持って、移植可能なコードの作成を支援したくないと言う人もいるかもしれません)。 C++ 機能の実装について。Visual Studio の C 標準のサポートに関する詳細については、Visual Studioの新しい C / C++ 標準のサポートを参照してください。

(現在では廃止されている) C99 の一部の機能は、VS2015 でサポートされています (ライブラリのサポート、ブロック内の任意の場所の変数宣言など)。いくつかの標準ライブラリ関数が実装されています: C++11/14/17 Features In VS 2015 RTMは次のように述べています:

Visual Studio 2015 は、C99 標準ライブラリを完全に実装していますが、Visual C++ コンパイラでまだサポートされていないコンパイラ機能に依存するライブラリ機能 (たとえば、<tgmath.h>実装されていません) は除きます。

しかし、私の知る限り、C11 は言うまでもなく C99 のコンパイラ機能の多くは未実装のままです。

于 2016-04-13T05:43:35.993 に答える
2
int arr[array_ele];

C99 以降でサポートされています。これを可変長配列と呼びます。gccそれをサポートします。Microsoft Visual Studio コンパイラはそれをサポートしていないようです。https://msdn.microsoft.com/en-us/library/zb1574zs.aspxを参照してください。

于 2016-04-13T05:42:51.853 に答える