C 2011 6.6 6:
整数定数式は整数型を持ち、整数定数、列挙定数、文字定数、結果が整数定数である sizeof 式、_Alignof 式、およびキャストの即値オペランドである浮動定数であるオペランドのみを持つ必要があります。整数定数式のキャスト演算子は、オペランドの一部として sizeof または _Alignof 演算子を除いて、算術型のみを整数型に変換します。
C 2011 6.7.9 4:
静的またはスレッド保存期間を持つオブジェクトの初期化子のすべての式は、定数式または文字列リテラルでなければなりません。
の本体内でオブジェクトを定義すると、main
自動保存期間が設定されますmain
(実行中のみ存在します)。関数の外でグローバルスコープでオブジェクトを定義すると、静的なストレージ期間があります(プログラムの存続期間中存在します)。
自動オブジェクトは、プログラムの実行時に初期化されるため、非定数を含むことができます。したがって、プログラムは計算を実行したり、他のオブジェクトから値を取得して値を計算したりできます。静的オブジェクトの初期値は、プログラム イメージに組み込むことができるように、プログラムを実行する前に使用できる必要があります。myFoo
あなたの例の の初期値はコンパイル時に把握できることは人間には明らかですが、これには、C 標準で要求する価値があると判断されなかったコンパイラでの追加作業が必要です。