2

なぜこのような宣言をするのか

int nArraySize = 7;
char szName[nArraySize] = "Mollie";

このエラーを返します:

error: variable-sized object 'szName' may not be initialized

しかし、「arraySize」変数を「const int」として宣言すると機能しますか?

const int nArraySize = 7;
char szName[nArraySize] = "Mollie";
4

5 に答える 5

3

最初に、C++ 言語では、配列宣言のサイズ部分が整数定数式 (ICE) である必要があることを言わなければなりません。イニシャライザで宣言されたconst intオブジェクトは、ICE で使用できます。intオブジェクトは ICE では使用できません。それが正式な部分です。

ただし、エラー メッセージから判断すると、C++ コンパイラC++ でC99 スタイルの可変長配列 (VLA) を非標準の拡張機能としてサポートしています。つまり、コンパイラでは、非定数式を使用して配列宣言でサイズを指定できます。ただし、VLA 自体がサポートされていても、そのような配列はまだ初期化できません。これは、C99 の VLA の仕様によって禁止されており、まさにその仕様が C++ コンパイラによって「継承」される方法です。

つまり、他の回答とは逆に、このコードはおそらく C++ コンパイラによって受け入れられるでしょう。

int nArraySize = 7;
char szName[nArraySize];

正式には違法な C++ ですが。= "Mollie"エラーの原因となる部分です。

于 2013-06-22T18:05:09.900 に答える
1

C++ は可変長配列をサポートしていないためです ( C-99標準で導入されましたが、C++ のどのバージョンでも導入されていません) nArraySizeconstintとして宣言すると、nArraySize実行時に変更される可能性があるため、コンパイラは文句を言います。nArraySizeがの場合const、コンパイラは実行時に変更できないことを認識しているため、 の配列サイズをszName可変にすることはできません (つまり、コンパイル時に推定できます)。C++ (および C99 より前のバージョンの C) では、配列のサイズは、コンパイル時に推定できる定数でなければなりません。

于 2013-06-22T17:51:54.777 に答える
0

1 つ目は可変長配列で、C では標準化されていますが (C99 標準以降)、C++ では標準化されていません。

C++ では、実行時ではなくコンパイル時にすべての配列のサイズを利用できるようにする必要があります。サイズを定数として宣言すると、コンパイル時の定数になります。

于 2013-06-22T17:51:46.277 に答える
0

プログラムは、変数に割り当てるメモリ量をコンパイル時に知る必要があるためです。nArraySize定数を作成しない場合、実行時に変更される可能性があると想定されます。定数にすることで、コンパイラはこの値が変更されないことを保証します。

于 2013-06-22T17:52:57.357 に答える
0

標準では、動的にサイズ変更され、静的に割り当てられた配列は許可されていません。GCC ではこれが可能であることに気付くかもしれませんが、これは、非準拠の動作を許可する多くの拡張機能の 1 つであるためです。

配列は次のように定義されます。

D1 [ constant-expressionopt] attribute-specifier-seqopt

サイズは整数定数式です。標準では、整数定数式を次のように定義しています。

整数定数式は、暗黙的に prvalue に変換された整数またはスコープなし列挙型の式であり、変換された式はコア定数式です。[注: このような式は、配列の境界 (8.3.4、5.3.4)、[...]として使用できます— 末尾の注]

int n = 10;
int x[n]; // error!

変数nは定数式ではないため、この場合は機能しません。

型に (C++11) を追加constexprすることで、定数式で使用できるようになります。しかし、この場合constはそれを機能させるのに十分です:

int const n = 5;

int x[n];

一方、動的配列は動的サイズ指定子を取ります。

int n = 10;

int *x = new int[n];

ただし、使用をお勧めするオプションはstd::vector、動的サイズのバッファーのラッパーです。

#include <vector>

int main()
{
    int n = 10;

    std::vector<int> x(n); // x.size() is 10
}

これが役に立ったことを願っています。

于 2013-06-22T18:06:12.623 に答える