精华内容
下载资源
问答
  • C语言程序从编写到运行历经几个阶段一 ...但实际上C语言程序从编写到运行,这期间经历并不是这么简单,那么现在小编就带领大家探索,这期间具体有哪几个步骤?一 过程简介从上图可知从C源码到可执行程序,我们会...

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

    一 前言

    在完成 .c 或 .cpp 文件的编写后,我们通常直接 gcc 或 g++ 后接文件名,就可以在当前文件夹下生成 a.out 可执行文件, 之后输入 ./a.out 即可执行该二进制可执行文件。

    但实际上C语言程序从编写到运行,这期间的经历并不是这么简单,那么现在小编就带领大家探索,这期间具体有哪几个步骤?

    一 过程简介

    5a64409d66f100a3bb74ea195850c6ef.png

    从上图可知从C源码到可执行程序,我们会历经三个步骤,分别是:预处理阶段、编译阶段以及最后的链接阶段。但是如果我们分的更细一点,其实我们可以分成四个步骤:

    3ff37a17563fcb87cee2e88c9069b71c.png

    显然由图片我们可以知道经历的四个步骤是:预处理、编译、汇编、链接

    通常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之后进行使用这么简单)

    关于宏定义的其他操作如下:

    1b17ea2683c825a5a69a691f65663d5b.png

    还有系统已经定义好的宏,我们可以直接拿过来使用

    8e6a5ed0c3015c406c36146d17eadcf4.png

    bbdef5635b030333d095ea8df9419f6e.png

    5a577c37def39817dab8bd6344a6a203.png

    在这里小编想强调两点:

    宏 只是替换

    例如我们上图中定义: #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 文件,此时就会出现几个对象文件

    五 链接阶段

    前一个阶段我们得到了若干个对象文件,现在我们要做的就是将这几个对象文件链接起来,形成最后的可执行文件。

    (这其中还涉及到静态链接库和动态链接库的概念,若想了解,请点击我)

    至此,我们的阐述就结束了。加油,路漫漫其修远兮,吾将上下而求索,与君共勉!!!

    展开全文
  • C语言程序运行的步骤

    千次阅读 2015-04-24 14:42:15
    C语言程序从编写到执行输出结果一般需要6个步骤:编辑(edit)、预处理(preprocess)、编译(compile)、连接(link)、装载(load)、和执行(execute)。编辑是通过编辑器书写C语言文本,该文本成为源文件,拓展名为....
    C语言程序从编写到执行输出结果一般需要6个步骤:编辑(edit)、预处理(preprocess)、编译(compile)、连接(link)、装载(load)、和执行(execute)。编辑是通过编辑器书写C语言文本,该文本成为源文件,拓展名为.c(在c++系统中为.cpp)。预处理执行程序中的预处理指令(他们是为优化代码而设计的),每条预处理指令以符号#开始,结尾不带分号。例如#include<stdio.h> #define max 100 等
    展开全文
  • GCC 编译器在编译一个C语言程序时需要经过以下 4 步:(1)将C语言源程序预处理,生成.i文件。(2)预处理后.i文件编译成为汇编语言,生成.s文件。(3)将汇编语言文件经过汇编,生成目标文件.o文件。(4)将各个模块.o...

    GCC 编译器在编译一个C语言程序时需要经过以下 4 步:

    (1)将C语言源程序预处理,生成.i文件。

    (2)预处理后的.i文件编译成为汇编语言,生成.s文件。

    (3)将汇编语言文件经过汇编,生成目标文件.o文件。

    (4)将各个模块的.o文件链接起来生成一个可执行程序文件。

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

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

    (1)宏定义指令,如#define Name TokenString,#undef等。对于前一个伪指令,预编译所要作得的是将程序中的所有Name用TokenString替换,但作为字符串常量的Name则不被替换。对于后者,则将取消对某个宏的定义,使以后该串的出现不再被替换。

    (2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif,等等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉。

    (3)加载头文件,如#include "FileName"或者#include 等。采用头文件的目的主要是为了使某些定义可以供多个不同的C源程序使用。因为在需要用到这些定义的C源程序中,只需加上一条#include语句即可,而不必再在此文件中将这些定义重复一遍。预编译程序将把头文件中的定义统统都加入到它所产生的输出文件中,以供编译程序对之进行处理。包含到c源程序中的头文件可以是系统提供的,这些头文件一般被放在/usr/include目录下。在程序中#include它们要使用尖括号(<>)。另外开发人员也可以定义自己的头文件,这些文件一般与c源程序放在同一目录下,此时在#include中要用双引号("")。

    预编译是将.c 文件转化成 .i文件,

    重定向使用的gcc命令是:gcc –E hello.c >hello.i

    在预处理阶段是不做语法检查的。

    展开全文
  • 原标题:你学不会C语言,是因为不会编写C程序的七个步骤C是一种编译性语言,编写一个C程序,这是一个很复杂的问题,面对复杂的问题,学会把它分解成若干个小问题,一个个小问题的解决,最后思路很清晰地解决掉这个...

    原标题:你学不会C语言,是因为不会编写C程序的七个步骤

    C是一种编译性语言,编写一个C程序,这是一个很复杂的问题,面对复杂的问题,学会把它分解成若干个小问题,一个个小问题的解决,最后思路很清晰地解决掉这个“麻烦”。

    02400359db1815326ef3b1596c04072a.png

    如果你以前从来没有接触过任何的编程语言,那么你则需要学习一下一个拆分的逻辑思维。当我们想要写一个项目或者软件的时候,我们需要把这个整体拆分为7个步骤,这样也会让你的思路看起来更有条理,再也不像从前那样毫无头绪了。

    171ae956c976cad17dfbe2d503570c6c.png

    1. 定义程序的目标

    动手写程序之前,要在脑中有清晰的思路。想要程序去做什么

    首先自己要明确自己想做什么

    思考你的程序需要哪些信息,你能通过哪些方法获取到哪些信息

    要进行哪些计算和控制

    程序应该要报告什么信息。

    在这一步骤中,不涉及具体的计算机语言,应该用一般术语概念来描述问题。简单来说,我们所要思考的就是,这个程序是用来做什么的。

    2. 设计程序

    对程序应该完成什么任务有概念性的认识后,就应该考虑如何用程序来完成它,把你的想法、思路往程序实现上逼近。

    例如

    用户界面应该是怎样的?

    如何组织程序?

    目标用户是谁?

    准备花多长时间来完成这个程序?

    在程序(还可能是辅助文件)中如何表示数据?

    用什么方法处理数据?

    通常,选择一个合适的方式表示信息可以更容易地设计程序和处理数据。

    这个部分其实就像写作文一样,当你想好要写什么题材的文章之后,接下来就要列出你文章中的大纲,需要几个段落,需要用到什么手法,每个段落写的是什么内容,一共有多少时间来给你完成这篇文章。把这些内容规划出来列成大纲,然后依次实现就可以了。

    3. 编写代码

    在程序有了清晰的设计后,就可以通过编写代码来实现它了。就是要把你设计的程序,按照你的解决逻辑翻译成C语言,一条条语句的打出来,将你的设计构思转变为 C 语言。这里是你真正需要使用 C 知识的地方。

    你可以在纸上勾画你的想法,但最终必须将代码输入计算机。一般而言,使用文本编辑器创建源代码文件。

    例:比如我要实现在屏幕上实现输出 helloworld!

    #include

    int main()

    {

    printf ("helloworld!\n");

    return 0;

    }

    这是一个最基础的C语言程序,其作用就是在屏幕上输出一句

    helloworld!。

    4. 编译

    编译器是把源代码转换成可执行代码的程序。可执行代码是用计算机的机器语言表示的代码。这种语言由数字码表示的指令组成。C编译器负责把C代码翻译成不同的特定的机器语言。

    此外,C编译器还将源代码与C库(库中包含大量的标准函数供用户使用,如printf()和scanf())的代码合并成最终的程序(更精确地说,应该是由一个被称为链接器的程序来链接库函数,但是在大多数系统中,编译器运行链接器)。其结果是,生成一个用户可以运行的可执行文件 (.exe 可执行文件 [for Windows] 或 .out 可执行文件 [for UNIX & Linux]),其中包含着计算机能理解的代码。编译器还会检查C语言程序是否有效。如果C编译器发现错误,就不生成可执行文件并报错。理解特定编译器报告的错误或警告信息是程序员要掌握的另一项技能。

    程序员需要熟练记忆编译器报错编号与错误问题的对应关系,这样有助于程序员迅速聚焦bug位置和问题所在!

    5. 运行程序

    上一步,编译链接成功后,就能进行正常的运行了。可运行的程序就是可执行文件.exe。

    一般来说,可执行文件就是你打开之后可以直接能够运行的文件。在一般的操作系统中(例如Windows,Linux),要想运行某个程序,只需要双击这个文件或者右键打开就可以运行,这就是可执行文件。

    那要怎么才能生成可执行文件呢?例如为在Windows环境中,用QT编译器运行程序可以用快捷键Ctrl+R生成程序并显示程序结构,如果用Visual Studio编译器则是Ctrl+F5编译运行。

    6. 测试和调试程序

    运行结果与自己设计的思路是否一致。

    程序能够正常运行那是极好的,但有时候它也可能运行不正确。因此,你应该进行检查,看程序是否存在错误。这个错误在计算机行话中称之为 Bug。调试(Debugging)就是要发现并修正程序错误。学习中自然会犯错误,看起来编程中似乎也会犯错误,所以在将所学知识应用到编程中时,最好准备好时时想到自己很容易犯错误。当你成为本领更强,技艺更精湛的程序员时,你的错误也会变得更严重而且不易察觉。

    你犯错误的机会很多。你可能会犯一个基本设计错误,可能会错误地实现了好的想法,可能会因为忽略了某个条件而将程序搞得一团糟,可能会错误地使用C,可能会犯打字母错误,也可能会将中英文输入搞错等等…

    不过,这并不是什么丢脸的事情,每个人都会犯错误,当你被一个错误折腾的焦头烂额的时候,你才会深刻的记住这个错误,以确保下次不会再犯。另外,编译器拥有简单找错误的能力,虽然不会具体到教你怎么改,但它会帮你标记出错误所在的那行,只要你认真仔细的检查错误的那几行并改正就可以了。

    7. 维护和修改代码

    在现实的工作中,这是软件维护工程师干的事,很多bug都是在产品使用多了后才发现的,他们最大的痛苦不是改错,是要看懂别人的代码后进行改错。平时写代码,要注重程序的可读性。最好是写完程序能够顺便标明注释。

    55f08239659449fef493ff822c01a2a6.png

    当然啦,这是最完美的状态。编程工作通常不像上面讲述的过程那样是一条线。在实际操作中,你可能需要做一些反复工作,例如,当你编写代码时,可能会发现你的计划是不切实际的。你可能会看到一种更好的实现方式,或者在看到程序的运行后,让你有了改变该设计的想法。对你的编程工作加以记录有助于在各阶段之间反复改动。

    所以,给你一句忠告,那就是应该养成在编写代码前先进行规划的习惯。一定要记下程序的目标,并勾勒出设计概貌。这样那么你会节省大量的时间并且做出来的程序也会非常不错。返回搜狐,查看更多

    责任编辑:

    展开全文
  • C语言程序编译步骤

    2020-07-27 14:25:43
    C语言代码编译成程序经过4步: 1)预处理:宏定义展开、头文件展开、条件编译等,同时将代码中注释删除,这里并...4)链接:C语言的程序是需要依赖各种库,所以编译之后还需要把库链接到最终执行程序中去 ...
  • 开发一个C语言程序需要经过四个步骤:编辑、编译、连接、运行。C语言程序可以使用在任意架构处理器上,只要那种架构处理器具有对应C语言编译器和库,然后将C源代码编译、连接成目标二进制文件之后即可运行。...
  • 算法的基本概念 2.C语言程序的结构 3.C语言程序的执行步骤 第二章 数据类型运算符与表达式 1.变量和常量的定义与使用方法 2.数据类型基本类型构造类型指针类型空类型及其定义方法 3.整型实型字符型数据的定义存储...
  • C语言程序的运行步骤

    千次阅读 2016-11-08 09:14:50
    翻译阶段由几个步骤组成,组成一个程序的每个(有可能有多个)源文件通过编译过程分别转换为目标代码(object code)。然后各个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。链接器同时也会...
  • <一>语言简洁、紧凑,使用方便灵活...C语言一个有32个关键字: auto\break\case\char\const\continue\default\do\double\else\enum\extert\ float\for\goto\if\int\long\register\return\short\signed\size...
  • 引言1.1 计算机程序的基本概念1.2 计算机程序设计的步骤与方法1.2.1 计算机程序设计的步骤1.2.2 计算机结构化程序设计方法1.3 算法及其表示1.3.1 算法的概念与特点1.3.2 算法的表示1.4 计算机程序设计语言1.4.1 ...
  • 概念:EQU用于为程序的常量、标号等定义一个等效的字符名称,俗称起别名,类似于C语言中的#define。也可以用"*"代替 语法:名字 EQU 值 例如:AAA EQU 0x3FFD000
  • 课程内容:C基础课程大纲、什么是IDE、IDE的汉化、源程序和可执行程序、关键字、类型、变量、数据、main函数、自定义函数、程序中标点符号和注释、c语言程序的开发步骤
  • 这段话核心意思是(,下列选项现步最佳想必性”经济其“应当,破现公现状和不...估计在选择较下控制低风险水平,执行制测种类必须为(控试。,注册重大现前后任会计会计报表计师计如果任注册会存在错报...
  • C程序的上机执行过程C语言处理系统提供的开发环境是编译系统,所以,C程序的上机执行过程一般要经过如图2-1所示的四个步骤,即:编辑、编译、连接和运行。图中虚线框内是C编译系统提供的语言处理程序和C标准库函数.....
  • 示例1:递归反向输出字符串 # include <stdio.h> void digui(char * p) { if(*p == '\0') ...首先digui()中参数定义了一个字符指针p,所以其指向是该字符串“ABC\0”首地址,所以*p=A(p是
  • gcc编译器工作步骤: 1、处理所有预处理指令 2、把第一步处理结构翻译成计算机认识格式(编译) 3、把第二部处理结果合并成最终执行文件(链接) gcc选项 : -E 只处理所有预处理指令 -c 只...
  • C语言从代码变成可执行程序的步骤:预处理----->编译----->汇编----->链接⒈预处理:去掉注释,加载头文件,代替宏定义,条件编译需要文件:.c文件生成产物:预处理文件(以.i结尾)使用方法:gcc hello.c -E...
  • C语言源码到可执行程序一般要经过以下处理步骤: 预处理 在这一阶段,源码中所有预处理语句得到处理,例如 #include语句所包含文件内容替换掉语句本身 所有已定义宏被展开 根据#ifdef,#if等语句条件...
  • 其中A是一个表达式(是值就没多大意义了,因为0代表假,非0代表真),如果A为真,就执行B(B可以是值或表达式 ),假就执行C要点二: a>b;,如果a>b;成立,则该表达式值为1, 不成立就为0(注意是表达式,即a&...
  • C语言程序设计教案 第六章 循环程序设计第六章 循环程序设计课题:第五章 选择结构程序设计教学目的:1、掌握三种循环语句语法结构2、灵活运用循环语句教学重点:教学难点:三种循环语句while、do-while、for三种...
  • c语言实现汉诺塔(程序执行步骤详解)

    万次阅读 多人点赞 2010-05-06 16:14:47
    很久没去接触c语言了,今天翻了翻c语言的书,偶然间看到了大一时让我郁闷了很久汉诺塔问题,又重新推理了一遍,汉诺塔实现采用递归算法,涉及到数据结构中知识。下面是c实现汉诺塔源码。程序只是实现了...
  • 其中包含以下内容:1 设置断点2 逐语句执行程序3 观察变量或表达式步骤如下:1 新建程序2 编译,运行程序3 设置断点4 逐语句调试5 观察变量或表达式值下面是一些屏幕截图: 程序代码:#include #include void ...
  • 使用C语言的七个步骤

    2018-09-17 16:02:06
    1、定义程序目标 程序应具有功能 2、设计程序 程序应如何组织 3、编写代码 用C语言编写代码 ... 链接器:将目标代码、系统标准启动代码和库代码结合起来,形成可执行文件 5、运行程序 ...
  • 计算机语言分类C语言发展简介C语言特点常见的C语言程序结构C语言编译步骤预处理头文件展开删除注释宏替换条件编译编译汇编链接gcc编译过程文件后缀解释简单的C语言程序实例helloworld程序解释system库函数防止...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,113
精华内容 445
关键字:

c语言程序的执行步骤

c语言 订阅