c语言编译生成cpp,C语言的编译过程

2012021816270588.jpg

编译: 编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。

流程:C源程序头文件 --> 预编译处理(cpp) --> 编译程序本身 --> 优化程序 --> 汇编程序 --> 链接程序 -–> 可执行文件

1. 编译预处理

读取C语言源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。

伪指令主要包括以下四个方面:

(1)宏定义指令

(2)条件编译指令,如#ifdef, #ifndef, #else, #elif, #endif

(3)头文件包含指令,如#include “FileName” 或者 #include 等。

(4)特殊符号,预编译程序可以识别一些特殊的符号。

预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。

2. 编译阶段

经过预编译得到的输出文件中,将只有常量,如数字、字符串、变量的定义,以及C语言的关键字,如main, if, else, for,

while, {, }, +, -, *, \,

等等。预编译程序所要做的工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。

3. 优化阶段

优化处理是编译系统中一项比较艰深的技术。它涉及到的问题不仅同编译技术本身有关,而且同机器的硬件环境也有很大的关系。优化一部分是对中间代码的优化。这种优化不依赖于具体的计算机。另一种优化则主要针对目标代码的生成而进行的。

经过优化得到的汇编代码必须经过汇编程序的汇编转换成相应的机器指令,方可能被机器执行。

4. 汇编过程

汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。

5. 链接程序

由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。例如,某个源文件中的函数可能引用了另一个源文件中定义的某个

符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。

链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VC++ 读取和保存文件对话框及默认目录

From: http://blog.csdn.net/miaoshengwu/article/details/1627283 void Openfile() {// TODO: Add your control notification handler code here//显示文件打开对话框CFileDialog dlg(TRUE, "EC", "*.aes", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, &qu…

设置启用树莓派的HDMI显示

树莓派所有的启动初始化都是在config.txt中完成的,因此,若插入HDMI树莓派没有显示桌面,则是没有配置HDMI。 首先在找到config.txt,两种方法: 第一种方法,将SD卡取出,用读卡器在windows上找到&…

c语言程序报告基本数据类型,C语言程序设计试验报告-基本数据类型和表达式-范本9(8页)-原创力文档...

PAGE安庆职业技术学院电子信息系实验报告(C语言程序设计)实验序号:第 1次实验名称:基本数据类型和表达式实验日期:实验成绩:90一、实验目的及要求(本次上机实践所涉及并要求掌握的知识点。)1.掌握C语言数据类型的种类和作用&#…

易经初学体会

易经初学体会 易经的占卜过程像是在做游戏,会让人对本来崇拜的神秘易经产生怀疑, 其实易经的占卜的推导过程是有科学依据的,是在长期实践和科学验算的过程中总结的公式,是古人对统计学的运用和总结,就像我们很难怀疑数…

前端小知识点(8):作者为什么设计原型

目录 一、从古代说起 二、Brendan Eich的选择 三、new运算符的缺点 四、prototype属性的引入 五、总结 六代码部分 一、从古代说起 要理解Javascript的设计思想,必须从它的诞生说起。 1994年,网景公司(Netscape)发布了Navi…

Windows 文件同步方案讨论

在日常运维工作中,经常会遇到这样的情况:我们需要在无人值守的情况下完成文件、文件夹的同步过程,已实现周期性的备份,避免单点故障。本研究实现了本地Windows主机与远程Windows主机,本地Windows主机与远程Linux主机目…

vs2008打开vs2010工程项目

From: http://blog.csdn.net/sonicrang/article/details/7387676 http://blog.csdn.net/godson_h/article/details/6575874 由于软件的向下兼容,vs2010可以打开vs2008项目,但是vs2008打开vs2010时会出现一些错误提示。解决办法如下:1. 替换…

递归求和的复习-计算m~n整数和

题目&#xff1a;实现一个计算m~n&#xff08;m<n&#xff09;之间所有整数的和的简单函数。 说明&#xff1a;接口函数int sum(int m, int n); 输入已经保证m < n. 采用递归算法来实现&#xff0c;其他类似&#xff0c;复习一下递归算法&#xff1a;1、退出条件 2、递…

c#语言float转换int,C#Float表达式:将结果float转换为int时的奇怪行为

我有以下简单代码&#xff1a;int speed1 (int)(6.2f * 10);float tmp 6.2f * 10;int speed2 (int)tmp;speed1并且speed2应该具有相同的值&#xff0c;但实际上&#xff0c;我有&#xff1a;speed1 61speed2 62我知道我可能应该使用Math.Round而不是强制转换&#xff0c;但…

前端小知识点(9):函数和对象之间的关系

目录 函数与对象之间的关系 代码演示 运行结果 函数与对象之间的关系 函数 有什么 &#xff1a; 函数也是对象 函数有&#xff1a;prototype 对象 有什么 对象&#xff1a;__proto__ 原型对象里面有什么&#xff1a;constructor 代码演示 //fun是一个函数&#xf…

【DICOMDIR专题】DICOMDIR基础知识及常见问题汇总

很多网友希望论坛能够出一些更专业、更细分的小专题&#xff0c;DICOMDIR就是目前需求量较大的专题之一。所以&#xff0c;结合网友所需&#xff0c;与几个关心此内容的朋友一起努力&#xff0c;做了一个小专题&#xff0c;希望对你有一些帮助&#xff5e;&#xff5e;DICOMDIR…

struct sockaddr_nl 结构体 由来、含义以及使用——获取Linux路由表

From: http://yangelc.blog.sohu.com/68245920.html Linux 用户态与内核态的交互 在 Linux 2.4 版以后版本的内核中&#xff0c;几乎全部的中断过程与用户态进程的通信都是使用 netlink 套接字实现的&#xff0c;例如iprote2网络管理工具&#xff0c;它与内核的交互就全部使用了…

Ubuntu 14.10 下运行进程实时监控pidstat命令详解

简介 pidstat主要用于监控全部或指定进程占用系统资源的情况&#xff0c;如CPU&#xff0c;内存、设备IO、任务切换、线程等。pidstat首次运行时显示自系统启动开始的各项统计信息&#xff0c;之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数…

Linux 给Qt应用软件创建图标启动

一、描述 Ubuntu源码编译安装Eclipse和Qt后&#xff0c;没有自动创建图标&#xff0c;每次启动需要进入到目录下运行脚本&#xff0c;比较麻烦。 可通过创建类似于windows系统的快捷方式进行快捷启动。 快捷方式一般以.desktop后缀命名&#xff0c;并保存到/usr/share/appli…

scheme解释器 C语言实现,使用Scala写了个简单的Scheme解释器

大家好&#xff0c;我使用scala实现了个简单的解释器&#xff0c;能够实现整数的加减乘除。我是照着快学 19章的 3 - 4 * 5 这个例子做的。思路也是按照它的来的。大概是这样 1)首先定义 factor是整数2)那么 term &#xff1a; ( factorfactor...) 就是一个完整的表达式了3) …

Android 的用户层 uevent处理机制

From: http://blog.csdn.net/linphusen/article/details/5667647 摘录几篇android研发日志 1 http://blog.csdn.net/linweig/archive/2010/06/01/5640697.aspx Firmware 加载原理分析&#xff0d;&#xff0d;&#xff0d;&#xff0d;分析的比较透彻&#xff0c;我在wifimod…

前端小知识点(10):原型链

目录 原型链 : 代码1 运行结果1 代码二 运行结果2 原型链 : 每一个对象都有一个原型&#xff08;__proto__&#xff09;&#xff0c;这个原型还可以拥有自己的原型&#xff0c;形成最终的原型链。 查找一个对象特定的属性或者方法&#xff0c;我们先去当前对象中找&#xff…

PS/2键盘鼠标接口各针脚定义

PS/2键盘鼠标接口各针脚定义(附图)好像很长时间也没有把这个最不被人重视的硬件问题提出来了&#xff0c;今天&#xff01;我们就来谈谈键盘、鼠标PS/2接头各针脚定义(图)。针脚序号颜色名称简称意义电平1绿(G)Keyboard DATADATA (D)数据负线高电平2ReservervedN/C未定义预留空…

用css写个三角形

样例&#xff1a; 代码&#xff1a; html: <div class"tips"> <span class"caret"></span> 我是一个tooltip </div>css: .tips {width: 200px;height: 50px;line-height: 50px;text-align: center;position: relative;margin: 20p…

Linux系统查看版本和位数

一、查看系统版本 lsb_release -a piraspberrypi:~ $ lsb_release -a No LSB modules are available. Distributor ID: Raspbian Description: Raspbian GNU/Linux 8.0 (jessie) Release: 8.0 Codename: jessie 二、查看系统所有信息 uname -a piraspberrypi:~…