2012-01-29 5 views
2

私はCで配列のサイズと機能の定数引数を使用++、エラー「必要な定数式」を与える:
enter image description here配列サイズとして使用される関数の定数引数にエラーがあるのはなぜですか?

ので、コンパイラが一定のオブジェクトとしてmを考慮していない、これは私が変更できることを意味します関数内mの値が、私はそれが与えるmの値をインクリメントしようとすると、エラー「constオブジェクト変更することはできません」:
enter image description here

それは私には本当にあいまいですが。誰でも私が間違っていることを説明できますか?

+13

HOLY COWどのようなプログラムですか?それは私が生まれたときから前のようです。O_O – Mehrdad

+0

@Mehrdad古代のTurbo C++です。 – cnicutar

+0

C++として編集およびタグ付けされています - Cにはデフォルト引数がありません。 – Mat

答えて

5

const実際には「この値は定数ですが、この値を変更することはできません」という意味ではありません。

これで、なぜ後者のコードがコンパイルに失敗するのですが、前者のコードがコンパイルできないのは明らかです。 5のデフォルト値を指定しても、の保証はありません。は5です。したがって、定数を持たないため、配列を作成することはできません。しかし、タイプはまだconstなので、変更することはできません。

つまり、C99以降、可変長配列を使用することができますので、実際には問題ありません。 (これはC++では大丈夫ではありません)。あなたのコンパイラはC99をサポートするには古すぎるようです。 (私は、最新のGCCを使うことを強くお勧めします)

+2

@Imran:CodeBlocksでは、 '-ansi'や' -std = C++ 98'フラグでコンパイルしていますか?そして警告はついていますか? –

4

可変サイズの配列を静的に作成することはできません。それはmalloc()のためです。コンパイラは、コンパイル時に何も知らないので、定数としてdelclaredされたとしても、定数として扱います。したがって、コンパイル時のコードを生成して静的配列を作成することはできません。

さらに、mをconst int m=5と宣言すると、地球上でなぜそれが増分できると思われますか?これは定数なので、値を変更することはできません。

ここではあいまいなものはありませんが、ちょっと考えてください。

+1

私はC99が 'alloca'のようなものを使ってこれを許していると思いますか? – Mehrdad

+0

いいえ、暗黙のうちではありません。 –

+0

はい、残念ながら... –

2

CodeBlocksはコンパイラではなくエディタ/ IDEです。私はGCCをコンパイラに使用していると仮定します。これは、C++のC99の可変長配列を使用する拡張機能を持っていると思います。

これはC++ 11でさえありません(おそらく、std::vectorがあるのでC++にはないでしょう)。したがって、これは20年前のコンパイラが実際に正しくなった数少ないケースの1つです。

私はあなたでしたが、私はまだTC++をダンプします。それは博物館に属します。

0

コンパイル時の定数式が必要です。だけでなく、const

関連する問題