c ++でストレージを割り当てた後、コンパイラが変数の値を知ることは可能ですか? そして、次のコードが与えられた場合、Cコンパイラの場合はどうなりますか
const int bufsize = 100;
char buf[bufsize];
テキストによる説明は次のとおりです。なぜそう言われるのですか?
C99 では、コードが関数内にある場合は問題ありません。変数はランタイム値として扱われますが、配列は可変長にすることができます。静的ストレージがある場合は許可されません。
C++ ではこれで問題ありません。const
整数変数は、コンパイル時の値として使用できます。
C の古いバージョンでは、許可されていませんでした。変数は実行時の値で、可変長配列は存在しませんでした。
なぜそう言われるのですか?
それは、言語設計者が言語の動作を決定した方法だからです。
C89 ではこれが許可されていません。これは、 aが定数式const int
と見なされず、配列のサイズを定数式として指定する必要があるためです。
C99 (およびそれ以降) では、可変長配列により、配列のサイズを定数式として指定する必要がなくなるため、これが許可されます (VLA が許可される場合、基本的には:static
またはグローバル)。
C++ では、配列のサイズを定数式 (C89 など) として指定する必要がありますが、const int
a を定数式1として使用できるため、これは許可されます。
1 @JamesKanze が指摘したように、単に変数の値が定数式と見なされることを保証するものではありconst int
ません。const int
それ自体が定数式である可視イニシャライザを持つのみが許可されますが、これらの制限はここで満たされています。
Cでは、const
宣言は定数式を生成しませんが、C++ では生成します。
そう、
const int bufsize = 100;
char buf[bufsize];
C++ では有効ですが、C では有効ではありません。
ただし、c99 以降、C 標準では可変長配列 (VLA)が許可されています。VLAは C++ 標準の一部ではありませんが、ほとんどのコンパイラはコンパイラ拡張機能を通じてサポートしています。
対照的に、明らかに最も明白な言語の一般化 (つまり、配列境界で定数の代わりに一般式を許可する) は、言語の型構造を複雑にし、データ型の計算を困難にし、配列のサイズを発見する際に不均一性を引き起こします。
(Journal of C Language Translation、vol 2 number 2、Dennis Ritchie からの抜粋)
この論文で、彼は VLA の使用を避けるように標準化団体に訴えました。
ただし、C の後のリリース (C99) ではこれが見直され、非グローバル スコープで可変長配列を使用できるようになりました。
C++ では、const 宣言された変数は定数式と見なされるため、これは有効です。