首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言笔记】C语言编译过程

下面以windows环境下test.c为例,test.c代码为: #include int main(void) { printf("This is a test program...\n"); return 0; } 其经历如下过程: ? 如图,编译生成可执行文件过程实际包含四个过程:(1)预处理;(2)编译;(3)汇编;(4)链接。...预处理命令为: gcc -E test.c -o test.i 上述命令中-E是让编译器在预处理之后就退出,不进行后续编译过程;-o是指定输出文件名。 预处理之后得到仍然是文本文件。...汇编过程命令为: gcc -c test.s -o test.o 上述命令中-c、-o让汇编器把汇编文件test.s转换成目标文件test.o。...链接过程命令为: gcc test.o -o test.exe 综上,生成可执行程序过程为:预处理、编译、汇编、链接。各个命令如下图所示: ?

12.1K30

C语言编译过程

如果用一张图来表示: image.png 编译,编译程序读取源程序(字符流),对之进行词法和语法分析,将高级语言指令转换为功能等效汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式要求链接生成可执行程序...如数字、字符串、变量定义,以及C语言关键字,如main,if,else,for,while,{,},+,-,*,\,等等。...经过优化得到汇编代码必须经过汇编程序汇编转换成相应机器指令,方可能被机器执行。 4.汇编过程 汇编过程实际上指把汇编语言代码翻译成目标机器指令过程。...对于被翻译系统处理每一个C语言源程序,都将最终经过这一处理而得到相应目标文件。目标文件中所存放也就是与源程序等效目标的机器语言代码。 目标文件由段组成。...经过上述五个过程C源程序就最终被转换成可执行文件了。缺省情况下这个可执行文件名字被命名为a.out。 老九学堂出品

1.9K20
您找到你想要的搜索结果了吗?
是的
没有找到

解密C语言编译背后过程

我们大部分程序员可能都是从C语言学起,写过几万行、几十万行、甚至上百万行代码,但是大家是否都清楚C语言编译完整过程呢,如果不清楚的话,我今天就带着大家一起来做个解密吧。...C语言相对于汇编语言是一种高级语言,要想在系统上运行,需要通过编译器把它转换成机器能够读懂可执行代码。...$gcc -save-temps hello.c –o hello $ls hello hello.c hello.i hello.o hello.s C编译器编译过程主要分成四步: (1) 预处理...2)编译 Compiling 编译将 hello.i 文件编译生成一个中间文件 hello.s,打开可以看到里边都是汇编语言,所以编译作用就是把源代码转换成汇编语言。 ?...到这里 C完整编译流程就结束了,本文示例用是Linux操作系统,编译器用是 gcc,但在其他操作系统,比如 Unix、Windows,或者用其他编译器,原理都是一样,感兴趣同学可以去学习一下编译原理

83030

C语言】 扫雷游戏(保姆级实现过程)

,演出并非我们所选择剧本 ---- 目录 write in front    Ⅰ 前言 Ⅱ 模块化编程   Ⅲ 游戏思路与逻辑 Ⅳ 实现游戏步骤/过程  ① 创建颜色函数  创建颜色函数color(...模块化编程:把各个模块代码放在不同.c文件里,在.h文件里提供外部可调用函数声明,其它.c文件想使用其中代码时,只需要#include "XXX.h"文件即可。...传统方式编程:所有的函数均放在main.c里,若使用模块比较多,则一个文件内会有很多代码,不利于代码组织和管理,而且很影响编程者思路。...模块化编程:把各个模块代码放在不同.c文件里,在.h文件里提供外部可调用函数声明,其它.c文件想使用其中代码时,只需要#include "XXX.h"文件即可。...---- Ⅳ 实现游戏步骤/过程  ---- ① 创建颜色函数  创建颜色函数color()  前景色颜色对应值↓ 0=黑色                8=灰色   1=蓝色

1.1K40

C语言编译全过程剖析

一、 摘要 C语言编译整个过程是非常复杂,里面涉及到编译器知识、硬件知识、工具链知识都是非常多,深入了解整个编译过程对工程师理解应用程序编写是有很大帮助,希望大家可以多了解一些,在遇到问题时多思考...二、 C语言编译全过程 1) 编译概念: 编译程序读取源程序(字符流),对之进行词法和语法分析,将高级语言指令转换为功能等效汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式要求链接生成可执行程序...经过优化得到汇编代码必须经过汇编程序汇编转换成相应机器指令,方可能被机器执行。 3. 汇编过程 汇编过程实际上指把汇编语言代码翻译成目标机器指令过程。...对于被翻译系统处理每一个C语言源程序,都将最终经过这一处理而得到相应目标文件。目标文件中所存放也就是与源程序等效目标的机器语言代码。...三、 总结 C语言编译整个过程是非常复杂,里面涉及到编译器知识、硬件知识、工具链知识都是非常多,深入了解整个编译过程对工程师理解应用程序编写是有很大帮助,希望大家可以多了解一些,在遇到问题时多思考

1.1K30

C语言】汇编角度剖析函数调用整个过程

提示:本文意在使用汇编语言给大家介绍函数调用中栈区上过程变化,加深我们对于代码底层理解,由于不同编译器使用下,可能造成一些差异,但这并不影响我们对于知识原理掌握,所以本文不必过多纠结细节处变化...call指令是调用子程序,后面紧跟应该是子程序名或者过程名。...ret 二、函数栈帧创建与销毁过程(从汇编角度去看) 1.从下面的原码中我们也可以看出,其实我们main函数也是被其他函数调用。...invoke_main() { return main(__argc, __argv, _get_initial_narrow_environment()); } 2.下面的代码分别是C语言代码和汇编语言代码...我们会通过汇编语言call指令,先将其下一条指令IP压栈到我们栈帧空间当中,并且指向call指令,会进入到被调用函数汇编代码当中,进行被调用函数汇编指令 并且我们函数调用结束后,通过ret指令能够回到上一层函数中

99910

快速适配 Flutter 之语言国际化

Flutter本身是具备国际化,在适配方面也较为简单,今天我将会介绍一个名为Flutter Intl插件快速实现Flutter语言国际化。...Flutter Intl 之前在学习适配国际化时候,出现最多一个组件叫做flutter_i18n[1],不过由于一些原因,这个插件已经停止维护了,后来无意中发现了一个名为Flutter Intl[2...有关这些应用程序属性更多信息,它们所依赖类型以及如何国际化Flutter应用程序,可以查阅官方文档?...《Flutter 应用里国际化》[3] 使用 上文提到了,配置好该插件后,我们需要做便是在arb文件中编辑相应字段即可,这里给出示例。 如果有其他语言,只需要再添加一份arb文件即可。...然后我们将选择好语言用SharedPreference保存,每次启动App时检查用户设置语言即可。

2.2K20

前端国际化语言包篇

开篇之前,读者需要区分好国际化(i18n - internationalization)和本地化(l10n - localization) , 它们是相互关联但又不同概念: 国际化(i18n):这是一个设计和开发过程...简单来说,国际化是创建一个可以轻易本地化产品过程,而本地化是将产品调整以适应特定地区过程。两者在实际产品中边界可能比没有那么清晰,而是相辅相成,通常在大国际化基座上进一步进行本地化。...国际化涉及面非常广,比如语言、文字编码、时区、书写习惯、单复数、标点符号、时间格式、货币格式、计量单位… 强烈推荐读者读一下 基础设计专栏 - From.RED 这个专栏,这里面一系列国际化/本地化文章都非常赞...: 为全球设计,国际化与本地化探索:快速入门 为全球设计,国际化与本地化探索:国际化设计 为全球设计,国际化与本地化探索:本地化设计 实际上笔者也不是特别专业,这系列文章仅是我一些技术实践总结。...相关源码可以看这里 3. 语言包管理 3.1 如何管理和分析语言使用? 那么如何提高前端国际化开发体验呢?

81930

C语言总集篇】指针篇——从不会到会过程

下面我们就来一起探讨一下; 12.1 变量 12.1.1 变量分类 对于C语言来说,变量可分为全局变量和局部变量,下面我们来看一下什么是局部变量,什么是全局变量: //变量分类 int a = 10...函数内部局部变量; 在C语言中,我们将花括号{}称为代码块,因为我们所有的代码都是需要再{}内部编写。...这种通过地址来修改变量方式是绕过了C语言语法规则,打破了const规则限制,这显然是不合理,那我们应该怎么做才能保证即使拿到了变量地址也无法对变量进行修改呢?...,数组指针是一个一级指针,而指针数组相当于一个二级指针; 十六、函数指针变量 C语言学习到现在,不知道大家有没有发现一个有趣事情,那就是C语言命名特别的简单粗暴: 对不同类型数组命名是字符数组、整型数组...,这样就提高了代码编写效率; 结语 【C语言总集篇5】指针篇内容咱们就全部介绍完了,这篇内容对指针与数组进行了深入剖析,我们通过类比方式介绍了不同类型指针与其对应数组。

17710

C语言总集篇】数组篇——从不会到会过程

这里类型指就是元素数据类型。所以我们需要有一个概念就是—— 只有相同类型元素才能组成一个集合。 在计算机语言中,我们把这种集合称为数组。...下面我们需要介绍一个C语言操作符——sizeof; sizeof是用来计算操作数所占内存空间大小操作符,单位是字节。这里操作数可以是变量、数据类型也可以是数组。...C语言本身是不做数组下标的越界检查,编译器也不一定报错;但是编译器不报错,并不意味着程序是正确,所以程序员写代码时最好自己做越界检查。...结语 这一篇内容是对C语言数组内容一个总集篇,里面涉及内容也是比较全面的,希望对各位刚刚学习C语言朋友,和想要回顾C语言相关知识点朋友提供一点帮助。...各位如果在学习过程中遇到了什么问题,都可以在评论区留言或者私信我,我在看到消息后也会第一时间回复。 接下来我也会陆续将操作符、指针、结构体等内容编写好后发出来,各位朋友记得关注哦!!!

24610

C语言总集篇】函数篇——从不会到会过程

二、C语言中函数分类 在C语言中函数分为两种:库函数、自定义函数。那什么是库函数,什么是自定义函数呢?咱们现在就来揭晓。 库函数 1.什么是库函数 库函数简单理解就是C语言数据库里面的函数。...,这样就大大增加了工作量; 所以,方便程序员更加高效编写代码,C语言就将这些函数给汇总并添加进了数据库中,这也就是所谓库函数。...换一种角度来看,库函数其实也是自定义函数,只不过这个自定义是C语言自定义。 3.怎么学习库函数呢?...C语言库中。...今天内容到这里就全部结束了,接下来我会继续给大家分享C语言学习相关知识点,咱们下一篇再见。

21011

用gcc编译c语言程序以及其编译过程

对于初学c语言编程我们来说,学会如何使用gcc编译器工具,对理解c语言执行过程,加深对c语言理解很重要!!!...(注意:编译后名字可以随意起,但是呢我们知道预编译后文件还是文本.c文件,所以为了好区分起名字为 xxx.c,这里我们为了显示整个过程,预编译后文件名我们起为xxx.i。)...在c语言中#开头语句又叫预编译指令。例如:#include 预编译功能之一:会把include包含头文件内容做一个简单替换,即替换到.c文件里面去。 .........,即把文本c语言编译为二进制指令。...(注意;用c语言代码依赖库最少,如果使用其他语言依赖库更多哦!!需要装好多包包。)

1.6K10

OushuDB-PL 过程语言-PLpgSQL - SQL过程语言

OushuDB兼容PostgreSQL,允许使用除了 SQL 和 C 之外其他语言编写用户定义函数。这些其他 语言通常被称作过程语言(Procedural Language, PL)。...对于一个用过程语言编写函数,数据库服务 器没有关于如何解释该函数源文本内建知识。因此,这个任务被交给一个了解语言细节特殊处理 器。...就像任何其他 C 函数一样,处理器本身是一个编译到共享对象并且按需 载入 C 语言函数。...PL/pgSQL - SQL过程语言 PL/pgSQL 是 PostgreSQL 数据库系统一个可加载过程语言,它设计目标是创建一种可加载过 程语言,可以: 用于创建函数和触发器过程 为 SQL...语言增加控制结构 执行复杂计算 继承所有用户定义类型、函数、操作符 定义为被服务器信任语言 容易使用 除了用于用户定义类型输入/输出转换和计算函数以外,任何可以在 C 语言函数里定义东西都可以在

67010

C语言中内存分布及程序运行加载过程

一个程序内存分配: 下图是APUE中一个典型C内存空间分布图(虚拟内存) 例如: #include int g1=0, g2=0, g3=0; int max(int i) { int m1=...: 可以看出,传入参数,局部变量,都是在栈顶分布, 随着子函数增多而向下增长....函数调用地址(函数运行代码)(高地址) 而malloc分配堆则存在于这些内存之上,并向上生长 全局变量,静态变量都是在分配内存低部存在(低地址) 程序如何装载 1 编译: 2 编译结果: file...version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0xd66ac36636c4fcfcbe395efb6bbd38c053e1c6c7...(Linux系统下) 左边是UNIX/LINUX系统执行文件,右边是对应进程逻辑地址空间划分情况。

2K80
领券