28

VLA、C99で定義されている可変長配列、MS Visual C ++での使用を有効にするにはどうすればよいですか、それともまったく不可能ですか?

はい、C ++標準はC89に基づいており、VLAはC89標準では使用できないため、C ++では使用できないことを知っていますが、MSVC ++もCコンパイラであると想定されており、/を使用してオンに切り替えることができます。 TCコンパイラパラメータ(Compile as C Code (/TC))。ただし、これを行うとVLAが有効にならないようで、コンパイルプロセスは失敗し、C ++(Compile as C++ Code (/TP))と同じエラーが発生します。たぶん、MSVC ++ CコンパイラはC89にのみ準拠しているのでしょうか、それとも何か(特別な構造またはプラグマ/定義)が不足しているのでしょうか?

コードサンプル:

#include <stdlib.h>

int main(int argc, char **argv)
{
  char pc[argc+5];

  /* do something useful with pc */

  return EXIT_SUCCESS;
}

コンパイルエラー:

エラーC2057:予期される定数式

エラーC2466:定数サイズ0の配列を割り当てることができません

エラーC2133:'pc':不明なサイズ

4

5 に答える 5

29

MSVCはC99コンパイラではなく、可変長配列をサポートしていません。

https://docs.microsoft.com/en-us/cpp/c-language/ansi-conformanceで、MSVCはC90に準拠していると文書化されています。

于 2011-03-09T14:10:19.513 に答える
8

VLAの記述は非常に優れていますがalloca()、の動的メモリ割り当てstd::vectorが禁止されている場合は、を使用して同様の動作を得ることができます。

http://msdn.microsoft.com/en-us/library/x9sx5da1.aspx

あなたの例で使用alloca()すると、次のようになります。

#include <stdlib.h>
#include <alloca.h>

int main(int argc, char **argv)
{
  char* pc = (char*) alloca(sizeof(char) * (argc+5));

  /* do something useful with pc */

  return EXIT_SUCCESS;
}
于 2013-08-13T00:30:55.053 に答える
6

私は同じ問題に遭遇しました。これはMSVisualC ++ 2015では不可能です。代わりに、ベクターを使用してほぼ同じことを行うことができます。違いは、ヒープリソース管理ルーチン(新規/削除)のオーバーヘッドが無視できることだけです。

VLAは便利ですが、スタックオーバーフローのリスクがあるスタックから非決定論的な量のメモリを割り当てることは、一般的には良い考えではありません。

于 2018-03-01T01:21:11.583 に答える
0

MSVC2015はC99をサポートしていません。代わりに動的メモリ割り当てを使用してこのロジックを使用してください。

#include <stdlib.h>

int main(int argc, char** argv)
{
    char* pc = (char*)malloc((argc + 5) * sizeof(char));

    /* do something useful with pc */
    
    free(pc);
    return EXIT_SUCCESS;
}
于 2021-07-03T18:15:07.927 に答える
-1

C ++を使用して可変長配列を作成するには、例を使用して、次のようにします。

size_t size = argc + 5;
vector<char> pc(size);

std:stringに変換したい場合:

string buffer(pc.begin(), pc.end());
于 2020-05-14T06:19:19.150 に答える