注目★★★★★Lobsters
C言語の sizeof パース、複合リテラル対応で格段に複雑化
30秒で把握
- 1sizeof 演算子のパース挙動が複合リテラル対応で複雑化、単純な先読みでは型名と式の判定が困難
- 2sizeof(int){0}.x[0]() のように括弧内型名と後続する後置演算子の組み合わせが増え、バックトラッキング回避戦略が破綻
- 3コンパイラ/パーサ実装時には複合リテラル対応を前提に設計し、型名と加算式 (sizeof(int)+1) の誤判定対策が必須
要約
C言語のコンパイラが sizeof 演算子を正しくパースするのは、一見シンプルに見えて実は難しいと指摘されている。単純なアプローチでは開き括弧を見つけたら型名をパースしようとするが、複合リテラル (compound literals) の存在によって問題が生じる。sizeof(int){0} は有効な C コードで、これが後置演算子 (ドット・括弧・インデックス等) を任意に続けられるため、パーサはそれら全てを追跡する必要がある。
あなたへの影響
C/C++ コンパイラやパーサを実装するチームは、sizeof と _Countof のパース時に複合リテラル後の後置演算子チェーンを必ず考慮し、単純な先読みで型名判定する設計を避けるべき。
推奨:現時点で即時対応は不要です。必要に応じて原文を確認してください。