GCC/Clang 如何缓冲预处理代码?

How does GCC/Clang buffer preprocessed code?

在实现 C 编译器时,缓冲预处理代码的最佳方法是什么,GCC/Clang 是如何做到的?他们是将输出写入单独的文件还是只是将其缓冲在内存中?

预处理的结果是一个标记序列,而不是一个字符串。

不同的编译器以不同的方式处理传入的令牌队列。我上次查看时,GCC 的 C 编译器或多或少地按需生成队列,尽管宏扩展会将多个标记排入队列。然而,C++ 编译器更积极地标记化——我的记忆是它标记了整个 TU,但我可能记错了——因为它有时需要任意前瞻。

无论您使用哪种策略,了解字符流和标记流之间的区别并避免标记化两次都很重要。这不仅仅是效率;这是一种避免微妙的预处理错误的方法。有关丰富的示例,请参阅旧版本的 Visual C。