从源代码(.c)到可执行文件一共分为五个步骤:

1、编译预处理

2、编译阶段

3、优化阶段

4、汇编过程

5、链接程序

一、编译预处理(.i) ------>"替代"成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件 。

读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。伪指令主要包括以下四个方面:

(1)宏定义指令。

如:#define M 9 、#define SQUARE(x) ((x)*(x)) 、#undef(取消宏定义),宏一般都是大写(以区别函数)。注意:作为字符串的常量则不被替换。

#define M 9

int main()

{

a=M;

printf("M=%d",a);

//printf("M=%d",9);

}

#define SQUARE(x) ((x)*(x))

// x * x

int main()

{

int a=4;

printf("%d\n",SQURE(a+1));

//printf("%d\n",((4+1)*(4+1)));

//printf("%d\n",  4+1 * 4+1  );

}

注意:参数列表的左括号必须与SQUARE紧邻、不能吝啬括号,否则会出现计算逻辑的问题。

(2)条件编译指令。

如:#ifdef,#ifndef,#else,#elif,#endif,等等。这些伪指令使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理(过滤作用),可避免重复复制代码。

#ifdef 标识符

程序段 1

#else

程序段 2

#endif

它的功能是,如果标识符已被 #define 命令定义过则对程序段 1 进行编译;否则对程序段 2 进行编译。

(3)头文件包含指令。

如:#include 、#include "stdio.h"等等。#include 是将已存在文件的内容复制到当前文件中,它可以使某些定义可以供多个不同的C源程序使用,只需加上一条#include语句 ,预编译就会自己把头文件中的定义统统都加入到它所产生的输出文件中,以供编译,而不用程序员再行定义。

注意: <> 和 "" 的区别。 <> 表示预处理到系统规定的路径中去获得这个文件,而 "" 则表示预处理应在当前目录中查找文件名为 stdio.h 的文件,若没有找到,则按系统指定的路径信息,搜索其他目录。

(4)特殊符号。

比如一些预定义符号__FILE__(表示正在编译的文件的名字)、 __TIME__(表示编译时刻的时间字符串)、 __LINE__(表示正在编译的文件的行号)、 __DATE__(表示编译时刻的日期字符串)、 __STDC__(判断该文件是不是定义成标准 C 程序),预编译程序对于在源程序中出现的这些串将用合适的值进行替换。

printf ("file:%s\tline:%d\tdate:%s\ttime:%s\n",__FILE__   ,__LINE__, __DATE__,__TIME__ );

# 运算符 和 ## 预算符

a、如果我们希望在字符串中包含宏参数,那我们就可以使用“#”,它可以把语言符号转化为字符串。

#include

#define SQR(x) printf("The square of "#x" is %d.\n",((x)*(x)))

int main()

{

SQR(8);

}

运行结果是:The square of 8 is 64.

b、“##”就是个粘合剂,可以将前后两部分粘合起来。

#include

#define XNAME(n) x ## n

int main()

{

XNAME(8) ;

}

运行结果是:x8

二、编译阶段(.s) -------> 翻译成等价的中间代码表示或汇编代码

经过预编译得到的输出文件中,将只有常量。

如:数字、字符串、变量的定义,以及C语言的关键字(main,if,else,for,while,{,},+,-,*,\)等等。

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

三、优化阶段(执行的效率的提高)。

(1)对中间代码的优化。

(2)与机器的硬件结构有关,比如:利用机器的各个硬件寄存器存放的有关变量的值,减少对于内存的访问次数等等。

四、汇编过程(.o) ------> 生成相应的目标文件 。

汇编过程对汇编器比较简单,汇编器只需将汇编代码转变成机器可以执行的指令,每一个汇编都有一条对应的机器指令,它没有复杂的语法也没有语义,也不需要指令优化,仅仅对照机器指令和汇编指令的对照表一一翻译。

目标文件中所存放的是与源程序等效的目标的机器语言代码。

目标文件由段组成。一个目标文件中至少有两个段:

代码段  主要包含的是程序的指令。该段一般是可读、可执行、不可写。

数据段  主要存放程序中的全局变量或静态的数据。一般数据段都是可读、可执行、可写 。

五、链接程序 ------->将有关的目标文件彼此相连接 。

由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题,比如函数调用、模块间的变量访问。

链接包括:地址和空间分配、重定位、符号决议。

重定位:假如有一个全局变量叫var,在目标文件 A 里,而目标文件 B 里边要使用var变量,我们编译目标文件 B ,由于在编译的时候编译器找不到var的地址,编译器在无法确定地址的情况下就将地址置为0,当链接器将 A 和 B 链接后,变量var的地址会确定下来,链接器将会修改地址,这地址修改的过程就称作重定位。

链接处理分为两种:

(1)静态链接,就是函数的代码将从静态链接库中被拷贝到可执行程序中(静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码),但这样使得可执行程序体积变大。

(2)动态链接,就是需要链接的代码放到一个共享对象中,链接程序只用记录可执行程序将来需要用的代码信息,在可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间, 动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。 比静态链接节约内存。

经过上述五个过程,C源程序就最终被转换成可执行文件了。

从编写c语言源程序到运行,c语言 源代码到可执行程序的过程相关推荐

  1. python语言源程序文件类型_Python语言源程序文件的文件类型是__________。

    [单选题]Do you know Li Ming? No, I don't know _____. [填空题]从同步.异步方式的角度讲,82C55的基本输入/输出方式属于 通讯 . [判断题]扩展I/ ...

  2. c语言 源程序代码,编程(C语言源程序代码)

    编程(C语言源程序代码) 已知 S=1+1/(1+2)+1/(1+2+3)+-+1/(1+2+3+-+N) ,当N的值为50时,求S的值. 要求:按四舍五入的方式精确到小数点后第四位. #includ ...

  3. c语言源程序文件有,C语言源程序文件的后缀是什么?

    什么是源程序?什么是源文件?源程序是一种计算机的代码.它会符合一定的语法,经过编译器编译或解释后生成具有一定功能的可执行文件或组件,也可以是某种接口.是用程序设计语言编写的程序. 源文件就是用汇编语言 ...

  4. win8编程c语言,Win8系统怎么运行C语言 win8系统运行C语言的方法

    C语言是一门通用计算机编程语言,是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言,但是许多win8系统用户并不知道要怎么运行C语言,针对这个情 ...

  5. c语言是否继续运行,C语言是否有运行时?

    C有一个标准库(libc在Linux上,它提供了像那些在如fprintf和如malloc以及所有的系统调用标准功能),甚至当你在独立模式下使用gccgcc -ffreestanding(例如,编译li ...

  6. 安卓studio如何C语言,android studio 运行c语言程序

    效果图:java 步骤1:选择Configure => SDK managerandroid 步骤2:选择SDK Tools ,勾选CMake,LLDB,NDK,这三个,点击下面的apply,而 ...

  7. c语言程序不能运行,C语言编程,我写了一个程序,但不能运行.

    首先把a.txt和b.txt读入链表,然后判断是否有相同,如果没有相同的就输到C.txt中. #include #include #include typedef struct 首先把a.txt和b. ...

  8. 如何在 VS Code 中编写、运行C语言程序 教程

    本篇目录 前言 1.下载.安装VS Code 2.安装VS code中2个插件 3.下载minGW64 4.配置系统的环境变量 5.C语言配置 6.编写一个测试程序 7.可能存在的问题 总结 前言 折 ...

  9. SAP UI5 标准应用的多语言支持 - SAP UI5 运行时语言判定机制

    SAP UI5 对多语言的支持特性如下: The language codes according to the de facto standard BCP-47, which are used by ...

  10. 以下不属于C语言字符集的为,c语言第1章练习题答案

    第一章 C语言概述练习题 一.选择题 1. C语言是一种( ). A) 机器语言 B) 汇编语言 C) 高级语言 D) 低级语言 2. 下列各项中,不是C语言的特点是( ). A) 语言简洁.紧凑,使 ...

最新文章

  1. 目前最实用的机器学习算法,你认为是哪几种?
  2. ibm750服务器维护,IBM 750服务器.PDF
  3. Dart Metadata 使用
  4. GDB调试程序系列 (3)
  5. epoll背后的原理
  6. python随机生成20个数字_python – 生成大量唯一的随机float32数字
  7. java类验证和装载顺序_Java类的加载机制和双亲委派模型
  8. EC600 QuecPython下载脚本代码到开发板、设置开机自运行
  9. Dapper.net 入门demo 轻量级ORM框架
  10. 结构方程模型_结构方程模型(Structural Equation Model, SEM) 三下
  11. JSP教程第2讲笔记
  12. Note that ‘/home/w/.local/share‘ is not in the search pathset by the XDG_DATA_HOME and XDG_DATA_DIRS
  13. python财务预算分析_从审计转到财务分析是怎样一种体验?
  14. 【快代理】隧道代理使用教程
  15. 标书制作详细教程(零基础速成,助力公司中标)
  16. entity framework migration
  17. What is base..ctor(); in C#?
  18. 数据结构c语言进制转换八进制,C语言数据结构中数制转换实例代码
  19. 计算机健康小知识,日常生活养生小知识
  20. CSS 网页字体最佳实践

热门文章

  1. labview控件旋转_基于LabVIEW的旋转倒立摆系统设计
  2. python测网速_tespeed-测试网速的Python工具
  3. U盘启动装系统的操作方法(U盘PE启动安装GHOST XP)
  4. 免费下载百度文库的几款在线工具推荐
  5. cve20190708补丁的kb名称_64位kb4499175补丁下载
  6. webpack的学习
  7. Delphi7--Delphi7软件的介绍
  8. (一)音视频:解码H264文件流程 渲染和拿到解码后源数据YUV 完整Demo
  9. cookie与session
  10. Java jar 包免费下载(全)