残念ながら、Cではconst
変数は実際には定数ではありません。
以下は、c99標準からの抜粋です。
6.7.8初期化
- 静的な保存期間を持つオブジェクトの初期化子のすべての式は、定数式または文字列リテラルでなければなりません。
定数は次のように定義されます。
6.4.4定数
構文
絶え間ない:
integer-constant (e.g. 4, 42L)
floating-constant (e.g. 0.345, .7)
enumeration-constant (stuff in enums)
character-constant (e.g. 'c', '\0')
この規格では、定数式を次のように定義しています。
6.6定数式
(7)初期化子の定数式には、より多くの許容範囲があります。このような定数式は、次のいずれかであるか、評価されます。
—算術定数式、
— nullポインタ定数、
—アドレス定数、または
—オブジェクトタイプのアドレス定数プラスまたはマイナス整数定数式。
(8)算術定数式は、算術型を持ち、
整数定数、浮動定数、列挙定数、文字定数、および式のサイズであるオペランドのみを持つものとします。算術定数式のキャスト演算子は、結果が整数定数であるsizeof演算子へのオペランドの一部を除いて、算術型を算術型に変換するだけです。
したがって、c
とa
は定数式ではなく、この場合は初期化子として使用できません。