C语言程序从编写到运行历经的几个阶段

您所在的位置:网站首页 开发汇编语言程序步骤包括哪些 C语言程序从编写到运行历经的几个阶段

C语言程序从编写到运行历经的几个阶段

2024-07-16 22:05:04| 来源: 网络整理| 查看: 265

C语言程序从编写到运行历经的几个阶段 一 前言

  在完成 .c 或 .cpp 文件的编写后,我们通常直接 gcc 或 g++ 后接文件名,就可以在当前文件夹下生成 a.out 可执行文件, 之后输入 ./a.out 即可执行该二进制可执行文件。   但实际上C语言程序从编写到运行,这期间的经历并不是这么简单,那么现在小编就带领大家探索,这期间具体有哪几个步骤?

一 过程简介

总过程   从上图可知从C源码到可执行程序,我们会历经三个步骤,分别是:预处理阶段、编译阶段以及最后的链接阶段。但是如果我们分的更细一点,其实我们可以分成四个步骤: 四步骤 显然由图片我们可以知道经历的四个步骤是:预处理、编译、汇编、链接 通常gcc命令后面不加选项的话,就会默认执行预处理、编译、汇编、链接所有步骤,若程序没有错误的话,我们就可以得到一个可执行文件,默认为 a.out, 这也是小编在前言中说的。 -E选项:编译器执行完预处理阶段就停止执行,后面的编译、汇编等操作就不会执行。 -S选项:编译器执行完编译阶段就会停止。 -c选项:编译器执行完汇编阶段就会停止。 其实,这三个阶段只是限定了编译器执行操作的截止时间,而不是单独的将某一步拎出来执行。

二 预处理阶段

执行 gcc -E hello.c > hello.i 命令后,我们仅仅执行预编译操作,生成一个.i 文件 (这个文件是我们最后还可以读得懂的文件了,我们可以打开这个文件,仔细观察程序出现了哪些变化)

那么预处理阶段都进行了哪些操作呢?

对所有以 # 开头的语句进行处理,其中包括我们熟知的:#define、#include 、条件编译指令#ifdef等。删除所有的“/**/”和“//”注释。添加行号和文件名标识,方便编译器产生的调用以及当出现编译错误或者是警告时可以显示行号。保留所有的 #pragma 编译指令

这里小编想着重阐述的是第一部分!!!   程序中以“#include”开头的语句都会被替换成相应头文件中的内容 (也就是说,项目中不论是自己写的 被#include ""引用的.h 头文件还是系统自带的#include 头文件,在预处理阶段阶段之后都会消失,并且这个过程是递归进行的,因为被包含的文件还有可能包含了其他文件,同时为了避免头文件的重复包含,我们引入了#ifdef,#ifndef等条件编译指令,这里就不细说)。 此外程序中的#define 定义的宏在使用的地方都会进行替换 (大家不要小看宏定义,这决不仅是 #define PI 3.14之后进行使用这么简单) 关于宏定义的其他操作如下: #define 还有系统已经定义好的宏,我们可以直接拿过来使用 预定义的宏 代码演示 条件编译 在这里小编想强调两点:

宏 只是替换 例如我们上图中定义: #define S(a, b) a * b,这显然是用来求乘积的,那我们现在在程序中调用它最终的结果是什么呢? 例如:S(5, 3 + 1),最后的结果会是: 5 * 4 = 20 吗? 显然不是,这条语句会被替换成:5 * 3 + 1,所以最终的答案是 16 !!! 同时也因为只是替换,所以宏替换不会占用程序的运行时间。可以通过宏 定义代码段 在这里大家可以粗略的理解成 “宏可以产生代码”。 至于每一行语句的最后需要加上反斜杠,这是因为宏定义只可以出现在一行,所以我们才使用 '\'进行连接。 三 编译阶段

使用 -S选项,编译器执行完编译阶段就结束,最后形成 .s 文件   应该说编译阶段是整个程序从C到机器语言翻译过程的核心,我们之前学习的编译原理这门课中讲到的词法分析、语法分析、语义分析以及之后的优化等其他操作, 其实就是在这个阶段执行的。

四 汇编阶段

使用 -c 选项,编译器执行完汇编阶段就结束,形成 .o (windows下为 .obj ) 对象文件。 其中汇编器将会汇编代码转换为机器可识别的机器代码,之前项目中有几个 source.c 文件,此时就会出现几个对象文件

五 链接阶段

前一个阶段我们得到了若干个对象文件,现在我们要做的就是将这几个对象文件链接起来,形成最后的可执行文件。 (这其中还涉及到静态链接库和动态链接库的概念,若想了解,请点击我)

(20220311更新) 静态链接库和动态链接库代码演示:

  静态链接和动态链接的区别在于:对函数库的链接是在编译期完成还是程序运行时期完成,若是编译期间则是静态链接,对应的函数库就是静态链接库 (linux下为.a文件,win下为.lib文件),若是在运行时期完成,则为动态链接,对应的函数库就是动态链接库 (linux下为.so文件,win下为.dll文件),不论静态链接库还是动态链接库,都是由若干个对象文件构成的。   闲话不多说,我们先写一些演示代码 (先演示静态链接库后演示动态链接库),如下分别创建:add.h、add.cpp、sub.h、sub.cpp、main.cpp 五个文件,文件内容如下:

/* sub.h 文件内容 */ #ifndef _SUB_H #define _SUB_H int sub(int, int); #endif /* sub.cpp 文件内容 */ #include "sub.h" int sub(int x, int y) { return x - y; } /* add.h 文件内容 */ #ifndef _ADD_H #define _ADD_H int add(int, int); #endif /* add.cpp 文件内容 */ #include "add.h" int add(int x, int y) { return x + y; } /* main.cpp 文件内容 */ #include "sub.h" #include "add.h" #include using namespace std; int main() { cout


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭