0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么C语言要进行编译

科技绿洲 来源:指尖动听知识库 作者:指尖动听知识库 2023-11-24 15:47 次阅读

为什么我们编写的C语言要进行编译?什么是编译?编译时发生了什么?

机器无法理解我们编写的C语言,而编译就是将面向人类的高级语言转换成为面向机器的机器语言的过程,图1是GCC编译器进行编译的过程,编译时主要分为了4个阶段,每个阶段的具体作用将在接下来进行介绍。

注:预处理中的cpp不是 c plus plus,而是c pre-process

Part1预处理

命令:gcc -E hello.c -o hello.i

编译过程的第一步预就是预处理,预处理结束后会产生一个后缀为(.i)的临时文件,这一步由预处理器完成。预处理器主要完成以下任务。

1.1 头文件展开

#include :在系统指定路径下寻找stdio.h;

#include "stdio.h" :在当前路径下寻找stdio.h 如果找不到则在系统指定路径下寻找stdio.h。

1.2 条件编译

根据不同情况编译不同代码、产生不同目标文件的机制,称为条件编译。条件编译是预处理程序的功能,不是编译器的功能;

这些操作都是在预处理阶段完成的,多余的代码以及所有的宏都不会参与编译,不仅保证了代码的正确性,还减小了编译后文件的体积;

条件编译主要处理内容为:#if,#ifdef,#ifndef, #if defined(AAA), #if defined AAA。

1.3 #define替换

将宏定义的常量或函数进行替换。

Part2编译

命令:gcc -S hello.c -o hello.s

C 中的编译阶段使用内置编译器软件将 (.i) 临时文件转换为具有汇编级指令(低级代码)的汇编文件 (.s)。为了提高程序的性能,编译器将中间文件转换为程序集文件;

汇编代码是一种简单的英文语言,用于编写低级指令(在微控制器程序中,我们使用汇编语言)。整个程序代码由编译器软件一次性解析(语法分析),并通过终端窗口告诉我们源代码中存在的任何语法错误或警告。

Part3汇编

命令:gcc -c hello.c -o hello.o。

使用汇编程序将程序集级代码(.s 文件)转换为机器可理解的代码(二进制/十六进制形式)。汇编程序是一个预先编写的程序,它将汇编代码转换为机器代码。它从程序集代码文件中获取基本指令,并将其转换为特定于计算机类型(称为目标代码)的二进制/十六进制代码;

生成的文件与程序集文件同名,在 DOS 中称为扩展名为 .obj 的对象文件,在 UNIX 操作系统中扩展名为 .o;

如图2显示了组装阶段如何工作的示例。程序集文件 hello.s 将转换为具有相同名称但扩展名不同的对象文件 hello.o。

图片
图2

Part4链接

命令:gcc hello.c -o hello

链接是将库文件包含在我们的程序中的过程。库文件是一些预定义的文件,其中包含机器语言中的函数定义,这些文件的扩展名为.lib。一些未知语句写入我们的操作系统无法理解的对象 (.o/.obj) 文件中。你可以把它理解为一本书,里面有一些你不知道的单词,你会用字典来找到这些单词的含义。同样,我们使用库文件来为对象文件中的一些未知语句赋予意义。链接过程会生成一个可执行文件,其扩展名为 .exe 在 DOS 中为 .out,在 UNIX 操作系统中为 .out;

如上图2,显示了链接阶段如何工作的示例,我们有一个具有机器级代码的对象文件,它通过链接器传递,链接器将库文件与对象文件链接以生成可执行文件。

Part5****结论

  • C中的编译过程也称为将人类可理解代码(C程序)转换为机器可理解代码(二进制代码)的过程;
  • C语言的编译过程包括四个步骤:预处理、编译、汇编和链接;
  • 预处理器执行删除注释、宏扩展、文件包含。这些命令在编译过程的第一步执行;
  • 编译器可以提高程序的性能,并将中间文件转换为汇编文件;
  • 汇编程序有助于将汇编文件转换为包含机器代码的对象文件;
  • 链接器用于将库文件与对象文件链接。这是编译中生成可执行文件的最后一步。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18275

    浏览量

    222158
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128641
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79541
  • 编译
    +关注

    关注

    0

    文章

    615

    浏览量

    32392
收藏 人收藏

    评论

    相关推荐

    几款C语言编译器推荐

    一些刚开始接触C语言编译的网友想下载一款C语言编译器来使用,不过,网络上有不少C语言编译器相关的
    发表于 09-05 09:19 9385次阅读

    ubuntu中安装gcc编译器并编译C语言

    对于习惯了使用windows进行开发的朋友们,如果想要编译C语言,只要要在windows中安装一个可以编译的IDE即可。或者直接自己加载编译
    发表于 01-11 15:50 3232次阅读
    ubuntu中安装gcc<b class='flag-5'>编译</b>器并<b class='flag-5'>编译</b>C<b class='flag-5'>语言</b>

    C语言编译过程

    C语言编译链接过程要把我们编写的一个C程序源代码,转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。过程图解如下。
    发表于 06-25 10:36 285次阅读
    C<b class='flag-5'>语言</b>的<b class='flag-5'>编译</b>过程

    C语言编译链接过程

      C语言编译链接过程要把我们编写的一个C程序源代码转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代
    的头像 发表于 08-21 10:06 1616次阅读
    C<b class='flag-5'>语言</b>的<b class='flag-5'>编译</b>链接过程

    C语言——编译器的问题

    定的,你没有办法达到目的,本质原因是sizeof操作符只是在“编译时(compile time)”起作用,而C语言编译单位是每次单个.c
    发表于 04-20 15:14

    MATLAB语言C语言的区别

    ,软件开发,单片机控制等。MATLAB能做的C语言肯定能做,但是一般麻烦的多,而C语言能做的MATLAB不一定能做。  形式上最容易发现的
    发表于 11-30 16:19

    C语言编译过程是怎样的

    C语言C语言编译过程,各过程作用预处理阶段将源码文件预处理:gcc -E xx.c -o xx.
    发表于 10-27 09:00

    C语言学到什么程度呢

    作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下。 在学习嵌入式Linux之前,肯定要有C语言基础。汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会)。C
    发表于 11-05 06:54

    为什么C语言?怎样去学C语言

    为什么很多人学不会C语言?为什么C语言?怎样去学C语言
    发表于 11-11 07:16

    C语言编译步骤

    嵌入式C语言开发入门——程序编译计算机语言发展过程C语言编译
    发表于 12-15 08:21

    如何提高C语言编程代码的效率

    的效率用C语言进行单片机程序设计是单片机开发与应用的必然趋势。如果使用C编程时,达到最高的效率,最好熟悉所使用的
    发表于 02-11 07:30

    既然C编译器是C语言写,那么第一个C编译器是怎样来的?

    既然C编译器是C语言写的,那第一个C编译器是怎样来的?
    的头像 发表于 02-25 15:47 2801次阅读

    linux中编译c语言的方法

    以上就是linux中如何编译c语言的详细内容。
    发表于 06-09 08:58 1287次阅读

    常见的C语言编译器是什么

    常见的C语言编译器是什么?大家一般都用的是什么软件呢?
    的头像 发表于 10-04 18:04 5926次阅读

    C语言中条件编译详解

    —般情况下,C语言源程序中的每一行代码.都要参加编译。但有时候出于对程序代码优化的考虑,希望只对其中一部分内容进行编译。此时就需要在程序中加上条件,让
    的头像 发表于 04-14 13:12 2511次阅读