在 C 语言中解析 sizeof 出奇地困难
来源:sebsite.pw — 2026-08-02
📋 概述
作者以 C 语言解析器为例说明 sizeof 操作符的语法歧义:其操作数既可以是单目表达式,也可以是带括号的类型名,且只有类型需要括号。朴素的两阶段解析方法会因复合字面量(compound literals)而失败——例如 sizeof(int){0} 中 (int){0} 其实是表达式。文章剖析了复合字面量后跟任意后缀运算符带来的解析复杂度。
🔑 核心要点
- sizeof 的操作数要么是单目表达式,要么是带括号的类型名,只有类型才必须加括号
- 朴素策略是先假设看到左括号就尝试解析类型名,只需预读一个 token
- 复合字面量让解析大幅复杂化:sizeof(int){0} 中的 (int){0} 是合法表达式
- 表达式之后还可跟任意多个后缀运算符,如 sizeof(T){}.x[0]()
💡 金句
(因为当然如此,C 语言里所有东西解析起来都出奇地困难。)
👍 0
👎 0
← 返回 Lobsters 首页