1

私は C++ の初心者で、学校のコンピューターでコーディングの練習をしているので、オンライン コンパイラ (www.CompileOnline.com) を使用する必要があります。関数によって定義された変数があり、次のように配列を初期化するために使用されます。

int var = 関数 (a);

int num[var];

このコードは Web サイトでは問題なく動作しますが、Visual Studio Express 2012 ではエラーが発生します。

C2057: 定数式が必要です

これは Visual Studio の問題ですか? これは C++ のルールだと読みましたが、なぜ Web サイトで機能するのでしょうか? どんな助けでも大歓迎です、ありがとう。

4

3 に答える 3

4

コード スニペットが必要とする機能は、可変長配列(VLA) と呼ばれます。C または C++ 言語でのこの機能のサポートは、コンパイラと標準のバージョンによって異なります。

  • C99 は、VLA を標準でサポートしています。
  • C99 より前のバージョン (C90 を含む) は VLA を標準としてサポートしていませんが、一部のコンパイラは言語拡張機能として VLA を実装している場合があります。
  • C11 では、VLA がオプション機能になります。
  • C++14 は、動的配列と呼ばれる VLA の制限付きバリアントをサポートしています。
  • C++14 より前のバージョン (C++11、C++03、および C++98 を含む) は、VLA を標準としてサポートしていませんが、一部のコンパイラは VLA を拡張機能として実装する場合があります。

特に、GCC は C90 および C++ の言語拡張として VLA を実装しており、明らかに www.compileonline.com はコンパイラとして GCC を使用しています (この記事の執筆時点ではバージョン 4.7.2)。VLA を実装する Visual C++ コンパイラのバージョンはありません。

Herb Sutter が C++14 の動的配列機能について語っています

この言語では、ドラフト C++14 で、スタックベースの配列のサイズを実行時に決定できるようになりました。

void f(std::size_t n)
{
   int a[n];

   ...

}

これは C99 の可変長配列 (VLA) と同じではないことに注意してください。また、C11 標準では VLA が条件付きでサポートされるようになったため、適合する C コンパイラで必要な移植可能な C の一部ではなくなりました。特に、C++ は、C++ が望ましくないと感じている C99 VLA の次の機能を明示的にサポートしていません。

  • 多次元配列。トップ レベル以外にランタイム バウンドがあります (同様に、新しい式の配列形式もそれをサポートしていません)。
  • 関数宣言構文の変更
  • sizeof(a)のサイズを返すランタイム評価式であるa
  • typedef int a[n];それを評価nして typedef に渡す

ほとんどすべてのバージョンの C++ で動作する C++ コードが必要な場合は、std::vector代わりに次の使用を検討してください。

#include <vector>

int main()
{
    int var = function(a); // Assume function() has been defined.
    std::vector<int> num(var); // Creates a vector with var number of elements.
    // ...
    int num1 = num[1]; // You can access elements in vectors just like arrays.
    num[1] += 10;
    // ...
}
于 2013-09-20T00:43:50.047 に答える
1

C++ では可変長配列は使用できません。配列のサイズは、コンパイル時に決定できる必要があります。

CompileOnline.com は、GNU GCC バージョン 4.7.2 を使用していると述べています。GCC には、 C++ で可変長配列をサポートする拡張機能があります。

可変長の自動配列は ISO C99 で許可されており、拡張として GCC は C90 モードと C++ でそれらを受け入れます。

于 2013-09-20T00:40:24.267 に答える
1

オンライン コンパイラは、可変長配列を C++ の拡張機能として実装するgccのようです。この場合の「問題」は、実際には VC++ ではなく gcc にあります。gcc は、デフォルトで有効になる拡張機能を実装し、ユーザーをだまして移植性のないコードを作成させます。

C++ で可変サイズの配列が必要な場合は<vector>、このヘッダーで宣言されたクラス テンプレートをインクルードして使用します。

int var = function(a);
std::vector<int> num(var);
于 2013-09-20T00:40:38.783 に答える