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
、整数定数式が必要なコンテキストで使用する場合は、実装によって提供されるマクロを使用する必要があり、独自のマクロをロールする必要がないということです。