编译过程本身不是一蹴而就的。事实上该过程可以划分为几个阶段,包括预处理阶段、语言分析阶段、汇编阶段、优化阶段和代码生成阶段。
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文件
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/142705.html