三、编译预处理阶段

编译过程本身不是一蹴而就的。事实上该过程可以划分为几个阶段,包括预处理阶段、语言分析阶段、汇编阶段、优化阶段和代码生成阶段。

3.1 预处理阶段

        编译过程的第一个阶段就是预处理阶段。该阶段要完成的任务:

  • 将#include关键字标示的含有定义的文件(包括文件或头文件)包含到源代码文件中。
  • 将#include语句指定的值转换成常量。
  • 在代码中调用宏的位置将宏定义转换成代码。
  • 根据#if、#elif、#endif包含或排除特定部分的代码

     经过预处理阶段之后会形成一系列的.i文件

3.1.1 实例演示

 1、第一个演示:

  addfun.h

//addfun.h
#ifndef ADDFUN_H
#define ADDFUN_H
int addfun(int a_,int b_);
#endif //ADDFUN_H

addfun.cpp

int addfun(int a_, int b_)
{
	return a_ + b_;
}

main.cpp

#include "addfun.h"
#include <iostream>
using namespace std; 

int main(int argc, char *argv[])
{
	int a = 9, b = 10;//define variable a & b
	cout << addfun(a,b) << endl;
}

打开终端(Windows的cmd),将路径调到上述文件所在路径下,

输入下列命令:

D:\software\项目\Code>g++ -E -P main.cpp -o main.i   (不支持-i参数)

D:\software\项目\Code>g++ -E -P -i main.cpp -o main.i   (支持-i参数)

        注意:根据版本的不同,有的支持-i参数,有点不支持-i参数。

执行完上述命令后,就会在相对应得位置生成一个main.i的文件,这个文件就是预处理的结果。

 

打开这个main.i文件,我们看到增加了很多内容。

 观察可以发现:

  • 将#include "addfun.h"直接展开为int addfun(int a_,int b_);
  • 将#include <iostream>命令展开,新增的大部分内容都来自iostream文件。

2、第二个演示

将main.cpp的内容修改为如下所示的内容:

#define ADDFUN_H
#define K 35
#include "addfun.h"
#include <iostream>
using namespace std; 

int main(int argc, char *argv[])
{
	int a = 9, c = 0;//define variable a & c
    c = K;
	cout << addfun(a,c) << endl;
}

执行完,上述预编译命令后,我们再次打开main.i这个文件,不难发现:

  • 在main.i的头部,我们看不到int addfun(int a_,int b_);语句了,这是因为我们在main.c中#define ADDFUN_H了,根据addfun.h中的预编译规则,屏蔽了#include "addfun.h"。
  • 将#include <iostream>命令展开,新增的大部分内容都来自iostream文件。
  • 在main.i的尾部,我们可以观察到原来的c = K现在已经变为c = 35,这是因为将#define K  35 命令进行了展开。

main.i文件


版权声明:本文为adminstate原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>