【发布时间】:2022-01-05 20:42:07
【问题描述】:
在实现 C 编译器时,缓冲预处理代码的最佳方法是什么,以及 GCC/Clang 是如何做到的?他们是将输出写入单独的文件还是只是将其缓冲在内存中?
【问题讨论】:
在实现 C 编译器时,缓冲预处理代码的最佳方法是什么,以及 GCC/Clang 是如何做到的?他们是将输出写入单独的文件还是只是将其缓冲在内存中?
【问题讨论】:
预处理的结果是一个记号序列,而不是一个字符串。
不同的编译器以不同的方式处理传入的令牌队列。上次我查看时,GCC 的 C 编译器或多或少地按需生成队列,尽管宏扩展会将多个令牌排入队列。然而,C++ 编译器更积极地标记化——我的记忆是它标记了整个 TU,但我可能记错了——因为它有时需要任意前瞻。
无论您使用哪种策略,重要的是要了解字符流和令牌流之间的区别,并避免两次令牌化。这不仅仅是一种效率。这是一种避免微妙的预处理错误的方法。查看旧版本的 Visual C 以获得丰富的示例。
【讨论】: