Cは、少なくとも3つのレベルの「定数式」を定義します。
- 定数式(修飾なし)
- 算術定数式
- 整数定数式
6.6パラグラフ3は次のように述べています。
定数式には、評価されない部分式に含まれている場合を除き、代入、インクリメント、デクリメント、関数呼び出し、またはコンマ演算子を含めることはできません。
それで、これは1,2定数式ではないという意味ですか?
パラグラフ8は次のように述べています。
算術定数式は、算術型を持ち、整数定数、浮動定数、列挙定数、文字定数、および式のサイズであるオペランドのみを持つものとします。算術定数式のキャスト演算子は、結果が整数定数であるsizeof演算子へのオペランドの一部を除いて、算術型を算術型に変換するだけです。
のオペランドは何(union { uint32_t i; float f; }){ 1 }.fですか?がオペランドの場合1、これはおそらく算術定数式です{ 1 }が、がオペランドの場合、明らかにそうではありません。
編集:別の興味深い観察:7.17段落3では、結果がoffsetof型の整数定数式である必要がありますが、私が知る限り、size_tの標準実装は、標準による整数定数式である必要はありません。offsetofもちろん、これは、実装が(6.6段落10の下で)他の形式の定数式を受け入れること、またはポインター減算ではなくoffsetofマクロを実装することを許可されているため、問題ありません。__builtin_offsetofただし、この観察の本質はoffsetof、整数定数式が必要なコンテキストで使用する場合は、実装によって提供されるマクロを使用する必要があり、独自のマクロをロールする必要がないということです。