2011-11-03 14 views
5
const int num = 16; 
struct inputs{ 
     double X1[num]; 
     double X2[num]; 
}; 

は私にエラーを与える:配列サイズの宣言Cの場合の違いやC++

error: variably modified ‘X1’ at file scope

同じことが 'X2' の本当でした。

しかし、私は上記のことがC++でうまくいることを覚えていますが、上記はうまくいきます(私はC++と間違えるかもしれません)。

誰でも私のためにこれを明確にすることはできますか?

答えて

3

はい、違いがあります。 Cでは、constの変数はまだ真のコンパイル時定数として扱われません(正式にはconstant expressionの一部ではありません)。これは許されません。ただし、Cではコンパイラが許可する必要はありませんが、標準では実装が他の形式の定数式を受け入れることを許可しているため、選択すると自由に受け入れることができます。

C++では、const変数は定数として扱われます。あなたは、関数のパラメータとして渡された値を使用する場合

は興味深いことに、おおよそ逆が真である:

void f(int size) { 
    int array[size]; 
} 

このはCではなくC++で許可さあります。これはvariably modified配列です。あなたが得ているエラーメッセージは、基本的にこれらが関数内でのみ許可されていることを伝えようとしています。

+0

Cでは、配列のサイズを関数に渡すことはできますか?学んだ!ありがとう! – Rich

+0

@Rich:はい、ただし、コンパイラがC99に準拠している場合(少なくともこの点について) - これはC89/90には含まれていませんでした(これは古いコンパイラでもかなり一般的でした)。 –

0

構造体にはありません。ローカルスコープで実行できます。

+0

C?他の答えによると、C言語ではC言語では大丈夫ですか? – Rich

+3

C99では、C89ではなく。 –

+0

私は正確な基準を覚えていないので、私はアダムを信頼したいと思います。彼のバージョンは妥当と思われる。 –

0

一定の値を使用する必要があります。したがって、Cでは、この点に関して#defineを使用する必要があります。 C++の場合はうまくいきました。代わりに、この

使用:C++で

#define num 16 
struct inputs{ 
    double X1[num]; 
    double X2[num]; 
}; 
+0

err ..スコープ内の '#define'? –

+0

言葉の悪い選択は、意味を意味します。 –

+0

それは良いです:) –

0

、時定数をコンパイルは、コンパイル時定数であることができる(それらの一部のみ)配列宣言とconst変数の長さとして使用することができます。これがC++で動作する理由です。

Cしかし、可変長配列と同様の機能を備えています。これは、配列の長さとして整数式(実行時でも計算される)を使用できることを意味しますが、ローカル変数に対してのみ使用できます。これは、あなたのコンパイラが "可変で変更された" X1 '(ファイルスコープでは ")に不平を言う理由です。

0

すでに他の人によって言われているように、CとC++は定数の定数表現に関して異なります。

しかし、両方で動作するコードを持つように提案されているマクロを使用する必要はありません。あなたが "スコープ"でそれをしたい場合は、列挙定数でそれを行うことができます。

enum { num = 16 }; 
struct inputs { 
    double X1[num]; 
    double X2[num]; 
}; 

ような何かに関係なく、ファイルまたは関数スコープでこれを入れた場合、両方のために働くだろう。

関連する問題