私はCで配列のサイズと機能の定数引数を使用++、エラー「必要な定数式」を与える:
配列サイズとして使用される関数の定数引数にエラーがあるのはなぜですか?
ので、コンパイラが一定のオブジェクトとしてm
を考慮していない、これは私が変更できることを意味します関数内m
の値が、私はそれが与えるm
の値をインクリメントしようとすると、エラー「constオブジェクト変更することはできません」:
それは私には本当にあいまいですが。誰でも私が間違っていることを説明できますか?
私はCで配列のサイズと機能の定数引数を使用++、エラー「必要な定数式」を与える:
配列サイズとして使用される関数の定数引数にエラーがあるのはなぜですか?
ので、コンパイラが一定のオブジェクトとしてm
を考慮していない、これは私が変更できることを意味します関数内m
の値が、私はそれが与えるm
の値をインクリメントしようとすると、エラー「constオブジェクト変更することはできません」:
それは私には本当にあいまいですが。誰でも私が間違っていることを説明できますか?
const
実際には「この値は定数ですが、この値を変更することはできません」という意味ではありません。
これで、なぜ後者のコードがコンパイルに失敗するのですが、前者のコードがコンパイルできないのは明らかです。 5
のデフォルト値を指定しても、の保証はありません。は5です。したがって、定数を持たないため、配列を作成することはできません。しかし、タイプはまだconst
なので、変更することはできません。
つまり、C99以降、可変長配列を使用することができますので、実際には問題ありません。 (これはC++では大丈夫ではありません)。あなたのコンパイラはC99をサポートするには古すぎるようです。 (私は、最新のGCCを使うことを強くお勧めします)
@Imran:CodeBlocksでは、 '-ansi'や' -std = C++ 98'フラグでコンパイルしていますか?そして警告はついていますか? –
可変サイズの配列を静的に作成することはできません。それはmalloc()
のためです。コンパイラは、コンパイル時に何も知らないので、定数としてdelclaredされたとしても、定数として扱います。したがって、コンパイル時のコードを生成して静的配列を作成することはできません。
さらに、mをconst int m=5
と宣言すると、地球上でなぜそれが増分できると思われますか?これは定数なので、値を変更することはできません。
ここではあいまいなものはありませんが、ちょっと考えてください。
CodeBlocksはコンパイラではなくエディタ/ IDEです。私はGCCをコンパイラに使用していると仮定します。これは、C++のC99の可変長配列を使用する拡張機能を持っていると思います。
これはC++ 11でさえありません(おそらく、std::vector
があるのでC++にはないでしょう)。したがって、これは20年前のコンパイラが実際に正しくなった数少ないケースの1つです。
私はあなたでしたが、私はまだTC++をダンプします。それは博物館に属します。
コンパイル時の定数式が必要です。だけでなく、const
。
HOLY COWどのようなプログラムですか?それは私が生まれたときから前のようです。O_O – Mehrdad
@Mehrdad古代のTurbo C++です。 – cnicutar
C++として編集およびタグ付けされています - Cにはデフォルト引数がありません。 – Mat