2012-03-31 1 views
1

自動および静的配列のサイズを宣言するために使用できる定数は、 です。この目的のために定数を使用しないのは、コンパイルエラーです。なぜ「定数のみを使って自動配列と静的配列のサイズを宣言できますか?

さんピアソン。

しかし、次の作品は問題ありません。ピアソンによると、それはうまくいかない(私は思う)。これを理解するのを助けることができますか? GNUコンパイラで見つかったC++の拡張機能だが、それは、C++標準に準拠していない

#include <iostream> 
using namespace std; 

int main() 
{ 
    int in; 
    cin >> in; 
    int a[in]; 

    a[4] = 412; 
    int i = 0; 
    while(i<5){ 
    cout << i << ":" << a[i] << endl; 
    i++; 
    } 
} 
+5

これは、C言語(C++ではなく、C++には可変長配列はありません)にのみ適用され、それをサポートする新しい標準とコンパイラを使用しているからです(Cを使用している場合)。 – Marlon

+1

コンパイラ*で*と動作しますか? – jamesdlin

+0

これは役に立つかもしれませんが、どのコンパイラが使用されているかわからないと確認できません。ドキュメント(Pearson)が参照する言語のバージョンのように動作するように、コンパイラを説得することができます。 gcc/g ++の場合、コマンドラインオプション '-std ='は特定の言語バージョンに設定することができます。 '-std = C++ 98'です。また、gccのドキュメントでは、より正確なメッセージを得るために '-pedantic'を使うことを推奨しています。これは正確ではないかもしれませんが、参考になるかもしれません。 – gbulmer

答えて

6

g++ -std=c++98を使用してコードをコンパイルすると、コンパイラはエラーを表示する必要があります。

2

C++コンパイラを使用している場合は、ほとんどのC++コンパイラでVariable Length arguments(VLA)をサポートするコンパイラ拡張が提供されているため、この機能は動作します。

Cコンパイラを使用している場合は、標準で許可されているため動作します。 C++、VLAで


C++標準によって許可されていないので、コンパイラの拡張機能を介してのいずれかの使用量は、あなたのコード以外の移植になります。
C++は、可変長配列またはCスタイルの配列のRESPを使用して、すべての要件を満たし、あなたがそれらを使用する必要がありますstd::vectorまたはのstd ::配列(C++ 11)を提供します。 C99標準以来、VLAのはC.

常に

オプション-ansi-std=c90または-std=iso9899:1990-std=c++03-std=c++0xのいずれかを使用し、GCCで標準を選択することで、あなたのコードをコンパイルするには許可されている、

注意。標準によって要求されるすべての診断を取得する。

0

これらと呼ばれている可変長配列(あなたがそれらをエラーではなく警告になりたい場合や-pedantic-errors
また-pedanticを指定する必要があります。可変長配列は、Cではサポートされており、C99標準以降でのみサポートされています。可変長配列は、であり、のいずれかによると、のC++の一部ではありません。標準です。

これをコンパイルすると、C99以上を使用しているか、@PhilippはC++に拡張機能を付けてコードを移植不可能にし、C++標準に準拠しないようにします。

関連する問題