大家对C语言的编译过程可能有个大致的理解,但是,详细到每一步具体都干了啥,可能有的人不是很清楚啦,也包括我,要不然,就不会做笔记了,哈哈...

0.主要步骤

① 步骤

编写源程序(.c) → 预处理 → 编译 → 汇编 → 链接

② 中间文件

图1 编译流程
注:GCC的目标文件(机器码)的后缀是 .o
Visual C++的目标文件的后缀是 .obj


1.预处理

① 预处理指令

大家刚开始写C语言程序时,肯定看到过这样的指令:

#include <stdio.h>

.h : 头文件扩展名,头文件包含C函数的声明与宏定义,可被多个源文件中引用共享. 有两种类型的头文件,一种是程序员编写的头文件和编译器自带的头文件,为区别这两种类型的头文件,写法略有不同,如下:

自定义头文件:#include "***.h"

库文件:#include <***.h>

在程序中使用头文件,需要使用C预处理指令#include来引用它. 前面我们已经看到过stdio.h头文件,它是编译器自带的头文件.

其实预处理指令不仅仅只有#include,如下:(带#的指令,它不是语句,所以不需要在后面加分号)

表1 预处理指令与意义

② 现在我们来说一下预处理操作到底干了些什么 ?

✦ 将所有的define删除,并且展开所有的宏定义,也就是:字符替换;

✦ 处理所有的条件编译指令,#if, #ifdef, #ifudef等;

✦ 处理#include,将#include指向的头文件插入到该行;

✦ 删除所有注释;

✦ 添加行号和文件标示,这样的在调试和编译出错时才知道是哪个文件的哪一行;

✦ 保留#pragma编译指令,因为编译器需要使用它们.


2.编译

编译的过程实质是把高级语言翻译为汇编语言的过程,那到底对 .i文件 做了些什么呢?

✦ 词法分析;

✦ 语法分析;

✦ 语义分析;

✦ 优化后生成相应的汇编代码.

高级语言汇编语言


3.汇编

其实我们经常把编译和汇编统统说成:编译.

汇编就是将汇编语言转成机器语言

汇编语言 → 机器语言 (二进制)


4.链接

链接的作用如下:

✦ 当源程序很大时,可以将它分为多个源程序,通过编译可以形成多个目标文件(Unix: .o),这时我们需要用链接器把它们连接到一起,生成一个可执行文件;

✦ 程序中调用了某个库文件中的子程序, 需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件;

✦ 一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接用来生成可执行文件,链接器程序将这些内容处理为最终的可执行信息. 所以,在只有一个源程序文件,而又不需要调用某个库中的子程序时,也必须用链接器对目标文件进行处理,生成可执行文件.

参考:

C语言真正的编译过程 - 无忧小菜 - 博客园

C语言编译过程详解 - CarpenterLee - 博客园

C语言的编译过程

-i 可以编译添加多个_C语言的编译过程相关推荐

  1. c语言的预编译指令是什么,c语言预编译指令有哪些?

    c语言预编译指令有哪些? 预处理器的主要作用就是把通过预处理的内建功能对一个资源进行等价替换,最常见的预处理器指令有:文件包含.条件编译.布局控制和宏替换4种. 文件包含 #include是一种最为常 ...

  2. char添加一个字符_C语言动态接收多个字符串

    1. 背景与基本原理      在一些场合下,用户往往需要动态输入字符串,如果程序能够自动接收传进的字符串并进行计数,便可以达到动态接收的效果.基本原理是定义一个指向字符串指针的指针,对其进行进一步细 ...

  3. 编译原理lr(0)c语言,关于编译原理:LR(1)LR(0)文法判断?

    "编译原理"是大学计算机类专业的一门主干课程.设置本课程的目的,在于系统的向学生讲述编译系统的结构.工程流程以及编译程序各组成部分的设计原理和实现技术,使学生通过本课程的学习,既掌 ...

  4. Android编译默认英语,Android系统语言出厂编译设置为简体中文

    Android系统默认的语言是英语,但是对于中国大陆Android产品厂商来说,不会出厂之后语言还是英语,到用户手里之后,用户自己设置成简体中文吧?有如果客户不懂英语,岂不是就不能设置系统语言了?所以 ...

  5. 鲁班语言软件包编译和安装指南(转)

    鲁班语言软件包编译和安装指南(转) 鲁班语言软件包编译和安装指南 http://project.soft114.com/lubankit/index_chinese.html 鲁班语言软件包是自由开源 ...

  6. 关注各种高级语言虚拟机(high-level language virtual machine,HLL VM)的设计与实现,泛化至各种高级语言的运行时的设计与实现,也会涉及动态编译、GC、动态语言的编

    关注各种高级语言虚拟机(high-level language virtual machine,HLL VM)的设计与实现,泛化至各种高级语言的运行时的设计与实现,也会涉及动态编译.GC.动态语言的编 ...

  7. c语言编辑编译链接,C语言的“编译、链接”

    我们写的代码,仅仅是文本文件(txt),不管后缀怎么变,终究是文本文件,计算机只能显示,不能做事(执行). 文本文件通过"编译.链接",成为可执行文件(windows下是exe): ...

  8. c语言程序设计编辑与调试环境实验报告,01程序设计基础实验报告_C语言程序设计基础.doc...

    01程序设计基础实验报告_C语言程序设计基础 程序设计基础 实验报告 题 目: C语言程序设计基础 院 (部): 管理工程学院 专 业: 信息管理与信息系统 班 级: 信管101 姓 名: 张三 学 ...

  9. c语言图形化编程入门_C语言C++新手入门,VS2013编程器安装教程

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

最新文章

  1. 多目标pareto最优解集构造方法
  2. SAP PLM进阶1 – 价值亮点
  3. halcon11用于C++的HTuple.h头文件,纯手添中文翻译!
  4. 20145237第六周学习总结
  5. 全国计算机等级考试题库二级C操作题100套(第33套)
  6. PL/SQL 包头和包体
  7. LaTeX符号大全-基于lshort-zh-cn
  8. VID = 058F PID = 6387 可用的量产工具
  9. python绘制隐含波动率曲面_隐含波动率曲面
  10. 初次 使用RuoYi 若依框架总结(前端)
  11. 基于JAVA图书商城购物系统的设计与实现
  12. html命名锚记链接失败,命名锚记(设置命名锚记超级链接)
  13. 黑客因网文作者写太烂盗其账号,帮改文更新修防火墙,网友:大佬能看看我的论文吗?...
  14. Ubuntu16.04(64bit)兼容32bit程序
  15. Redis上踩过的一些坑-美团
  16. ASTERISK+LINUX+PHP 的WebCall, 网页回拨源码
  17. 使用Wamp在win7上搭WEB服务器
  18. u盘格式化后数据恢复
  19. 数学难题html5小游戏答案,数学难题大全及答案
  20. [APIO2018] New Home 新家

热门文章

  1. 家居建材企业信息化管理路在何方?
  2. 这种事都有?建行网银把Demo版的放上线了?!
  3. nsdata是java什么类型_Swift中基本数据类型与NSData转换
  4. java s0 s1_Java GC 变量含义(S0 S1 E O P YGC YGCT FGC FGCT GCT)详解
  5. ssd测试软件cy,目标检测实践_tensorflow版SSD模型测试
  6. java 生成 防伪码,优秀的生成防伪码的代码应该如何写?百万千万量级别的。
  7. 智慧农场基本情况交流会议记录
  8. 单个晶体管形成的奇怪振荡电路
  9. 测试无线节能信标与主控器之间的控制功能
  10. 对机械臂的肩关节与肘关节编码器连接与设置