三、编译预处理阶段

命运对每个人都是一样的,不一样的是各自的努力和付出不同,付出的越多,努力的越多,得到的回报也越多,在你累的时候请看一下身边比你成功却还比你更努力的人,这样,你就会更有动力。

导读:本篇文章讲解 三、编译预处理阶段,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!