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

    文章

    19259

    浏览量

    229649
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136683
  • 程序
    +关注

    关注

    117

    文章

    3785

    浏览量

    81002
  • 编译
    +关注

    关注

    0

    文章

    657

    浏览量

    32852
收藏 人收藏

    评论

    相关推荐

    几款C语言编译器推荐

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

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

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

    C语言编译过程

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

    C语言编译链接过程

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

    C语言编译

    电子发烧友网站提供《C语言编译器.exe》资料免费下载
    发表于 01-15 17:45 50次下载

    C程序设计教程之如何进行编译预处理

    预处理是 C 语言的一个重要功能,它由预处理程序负责完成。所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。当对一个源文件
    发表于 11-02 15:47 5次下载

    C语言程序设计教程之如何进行函数与编译预处理资料概述

    本文档的主要内容详细介绍的是C语言程序设计教程之如何进行函数与编译预处理资料概述主要内容包括了:1 函数概述2 函数定义与调用3 局部变量和全局变量4 变量的生存期和存储类别5
    发表于 12-10 17:16 4次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>程序设计教程之如何<b class='flag-5'>进行</b>函数与<b class='flag-5'>编译</b>预处理资料概述

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

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

    编译原理的角度看C语言如何转换成汇编语言的?

    编译原理的角度看C语言是如何转换成汇编语言的?
    的头像 发表于 02-25 15:52 2642次阅读
    从<b class='flag-5'>编译</b>原理的角度看<b class='flag-5'>C</b><b class='flag-5'>语言</b>如何转换成汇编<b class='flag-5'>语言</b>的?

    linux中编译c语言的方法

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

    解析C语言编译过程中所做的工作

    C语言编译链接过程要把我们编写的一个C程序源代码,转换成可以在硬件上运行的程序(可执行代码),需要进行
    的头像 发表于 06-27 10:21 3159次阅读
    解析<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>编译</b>过程中所做的工作

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

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

    C语言条件编译语句and单片机DMA的介绍

    C语言条件编译语句and单片机DMA的介绍C语言条件编译:这里面介绍的很详细,也有历程。DMA的
    发表于 11-29 10:36 3次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>条件<b class='flag-5'>编译</b>语句and单片机DMA的介绍

    C语言中条件编译详解

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

    CA850 Ver.3.20 C语言编译

    CA850 Ver.3.20 C语言编译
    发表于 05-04 19:03 0次下载
    CA850 Ver.3.20 <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>编译</b>包