我正在翻阅这本书[让我们看看卡内特卡尔的作品],书中写道:
当我们编译一个程序时,在源代码传递给编译器之前,C预处理器会检查它是否有宏定义。当它看到define指令时,它会在整个程序中搜索宏模板;无论它在哪里找到宏模板,它都会用适当的宏扩展替换宏模板。只有在这个过程完成后,程序才会被处理到编译器。
我的问题是,在将程序传递给编译器之前,预处理器程序如何能够读取与宏模板相对应的标记?是预处理器程序也能将程序划分为令牌。
最佳答案
这种描述令人困惑(因此我不推荐这本书;请阅读K&R The C Programming Language book)。预处理器不会遍历整个程序,它以前处理过一些输入。只有过去的预处理输入才对预处理器的行为有影响(换句话说,预处理器是一个单通道机制)。
阅读C preprocessor上的wikipage,然后阅读GNU cpp的文档和preprocessor上的其他文档,以及C programming/Preprocessor上的wikibook章节。
在当前的C编译器中(出于性能原因),预处理器不再是一个单独的程序,而是编译器本身的一部分。对于最近的GCC,请查看libcpp/(其预处理器库,编译器内部)。
如果使用GCC编译器,您可以通过运行csource.c
然后查看生成的预处理表单gcc -C -E csource.c > csource.i
(例如使用source code或编辑器)来获得pager文件csource.i
的预处理表单。
(我强烈建议您偶尔这样做;您将学到很多;是的,您可能会对通常的#include <stdio.h>
指令所产生的代码量感到惊讶)
我相信你的书解释错了。预处理器处理每个预处理directive。当遇到#define
时,它会将该符号的定义存储在某个预处理器符号表中。当它在之后遇到该预处理器符号的出现时,它会进行适当的替换。
关于c - 预处理程序指令如何在C中工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42315067/