あなたは三項演算子を使用しますが、静的またはスレッドローカルストレージクラスとオブジェクトに対して、初期化子式はコンパイル時定数である必要がありますことを心に留めておくことができます。
const int bar = 42;
#define BAR 42
#if 0
const int foo = bar ? 1 : 2; /*ERROR -- bar is not an integer constant */
#else
const int foo = BAR ? 1 : 2;
#endif
void fn(void)
{
const int foo = bar ? 1 : 2;
#if 0
static const int stc_foo = bar ? 1 : 2; /*ERROR*/
#else
static const int stc_foo = BAR ? 1 : 2;
#endif
}
理由はif-elseステートメントが初期化に使用できないということです。なぜなら、それを許可するにはC文法にかなりの変更が必要であり、おそらくC文法とセマンティクスをはるかに複雑にするからです。
基本的に、単に宣言子の後に=
とinitializer
という式があり、その初期化式が定数であることを確認するのではなく、コンパイラは静的/スレッドローカル変数を覚えておく必要があります初期化し、それに続いて無条件に実行されるコンパイル時に評価可能な分岐を探し、その分岐を初期化に使用します。
さらに、ファイルスコープで文を許可する必要があります(現在のC文法ではファイルスコープでは文が許可されません)。また、翻訳単位ローカルグローバル変数への書き込みに制限されたconstnessとメモリアクセスが検証されます。あるいは、それらは暗黙的にグローバルコンストラクタに変換される可能性がありますが、コンパイルユニット間のコンストラクタの順序付け(コンストラクタの生成が暗黙的であれば解決しにくい)、最初のコンストラクタでグローバルコンストラクタをサポートする実装の必要性静的変数割り当ての現在のやや単純なパフォーマンス特性のぼやけ、
「const」を初期化するのは、定義のポイントで行われ、コンパイラによって実行されるためです。実行時にすべての変数が定義された後、 'if'ステートメントが実行されます。 – Peter
'foo = 1;'は_initialization_ではないことに注意してください。 'foo'に値が与えられたのは初めてですが、_assignment_です。 'int foo = 42;'は_initialization_の例です。 – chux
@jhバック私はそれが不可能である理由を理解しようとしました。私の編集を見てください。 – PSkocik