预处理器的工作

说到程序的编译执行,大家都知道不可或缺的几样组件是:预处理器,编译器,汇编器,链接器。但是这些组件在程序生成可执行文件的过程中的发挥的具体作用是怎么样的,其实不是很容易搞清的。下面我就针对预处理器的工作做一个简介。

在程序代码完成之后,预处理器首先对.cpp文件进行读取,读入文件内容,会将读取到的内容存放到一个临时文件,这个临时文件就是我们的源代码了,这份源代码会发送给编译器,由编译器对其进行语法,语义分析。当然,这份源代码与之前的源代码有不同。在这份源代码中,所有的注释都会被清掉,而所有的预处理命令类似宏操作等等,均会直接被替换。下面就预处理的过程进行简单说明。

  • 读取程序文件

首先预处理器将程序文件进行读取,由于预处理器并没有语法,词法分析的功能。所以,预处理器只会较为机械的将你的程序文件内容进行读取,而不会检查你的语法错误,所有的语法错误均在编译器里进行检查。预处理器只会有词法分析其进行简单的预处理命令分析。
  • 执行预处理命令

当读取程序文件的时候,会读取到预处理命令,类似宏的命令等,这个时候,预处理器会执行这些预处理命令。最简单的操作就是宏替换。预处理的命令总共有三种,分别是:
1. 宏命令
2. 文件包含
3.条件编译

当预处理对程序文件进行读取,读取到宏命令的时候,直接对宏命令进行替换操作。
当预处理器读取到文件包含的时候,例如:#include “”,这个时候,预处理器会对该命令进行解析,并将#include所指引的文件进行索引,找到头文件之后,打开头文件内容,将其中的内容读取到源程序中去。这其中是将文件内容插入到源程序中的。如果其中头文件中也包含#include的预处理命令的话,那么继续进行递归嵌套了。
较为复杂和麻烦的是当遇到条件编译命令的时候,条件编译命令现在主要有两种:
#ifndef和pramgram once两种,现在使用较为广泛的还是#indef,其中主要的原因是因为它对C/C++的标准支持的较好。但是关于两种的具体区别,在此就不在进行详细讨论了!
当预处理器碰到条件编译的情况下,需要对程序文件进行是否多次包含的判断,如果在源程序中已经读取了这个文件了,那么对该文件直接进行忽略。否则,读取该程序文件,在#ifdef中,会对程序代码进行检查,检查是否重新包含,而pramgram once则不会进行代码的多次包含检查!

程序文件经过预处理器的处理之后,得到的是一个真正的源代码,其中没有注释,所有的预处理命令也全被转换成代码,源代码文件一般以.cc结尾命名,将源程序交给编译器,由编译器对源程序进行词法、语法、语义的分析处理。

你可能感兴趣的:(预处理器的工作)