Sizeof is surprisingly difficult to parse in C
8 hours ago
- sizeof的操作数可以是单目表达式或带括号的类型名,表达式不需要括号。
- 解析sizeof首先检查是否有左括号,尝试解析类型名;如果失败,则将其视为表达式。
- 像sizeof(int){0}这样的复合字面量会使解析复杂化,因为它们可能在右花括号后包含后缀运算符。
- 一种解决方案是通过在类型名后检查'{'标记,然后解析任何后续后缀运算符来处理复合字面量。
- 另一种方法是编写一个函数,无需回溯即可解析单目表达式或带括号的类型名,但要小心sizeof(int)+1这样的表达式,避免将其解析为强制类型转换。
- 这些原则也适用于C2y中新增的_Countof运算符。