一个通过 C 编译器如何处理标签?

How one pass C compiler deal with labels?

有时在声明之前使用标签,例如:

void test() {
  goto label;
  label: return;
}

当一次性编译器解析第一个语句时,它不知道标签在哪里,直到 label: 语句出现。

由于一次编译器只解析一次代码,所以没有办法让 label 独自一人稍后再回来,对吗?

那么在一个编译器中处理这个问题的通常方法是什么?

两种可能性:

  1. 回贴。使用生成的分支操作中的目标地址字段来创建一个 linked 标签未解析使用列表,将列表的头部放在标签符号 table 中。定义标签后,遍历列表,用正确的值覆盖 ("patching") 每个 link。

  2. 如果允许生成符号汇编代码,只输出标签名,让汇编程序处理即可。