编辑器vim和编译器gcc/g++

news2024/11/20 10:23:17

目录

一、编辑器vim

1、概念

2、基本操作

1、进入vim

2、模式切换

3、命令行模式

4、插入模式

5、底行模式

6、vim 的配置

二、编译器gcc/g++

1、概念

2、背景知识

3、gcc/g++中的编译链接

1、预处理

2、编译

3、汇编

4、链接

4、函数库

1、静态库

2、动态库


一、编辑器vim

1、概念

vim是一种常用于linux下的多模式编辑器。在vim中有好多模式,我们先了解这三种即可:分别是命令行模式(command mode)、插入模式(Insert mode)和底行模式(last line mode)。

1、正常/普通/命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode


2、插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。


3、底行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。

vim作为一种编辑器,它只能用来写代码,至于代码是否编译成功和是否能够运行成功,它一概不关注,它只能用来进行代码的编辑。

三种模式之间的切换:

注:q!(强转退出) ,wq(保存并退出)。

2、基本操作

1、进入vim

输入命令:vim 文件名。进入vim全屏幕编辑画面。进入之后是处于命令行模式,你要切换到插入模式才能够输入文字进行编辑。

2、模式切换

三种模式的切换见上图。

3、命令行模式

命令行模式下的常用命令:

1、yy:将光标当前所在行的内容进行复制。n yy:n表示具体整数,表示可以复制从该行开始的n行内容。

2、p:将复制的内容进行粘贴。n p:将复制的内容粘贴n行。

3u:撤销操作。

4、ctrl + r:撤销u操作。

5、光标定位:

shift + g:将光标定位到文件的结尾。

gg:将光标定位到文件的开始。

n shift g :将光标定位到文件的任意一行。

shift + 6(^):将光标定位到当前行的最开始。

shift + 4($):将光标定位到当前行的结尾。

h、j、k、l:光标分别进行 左、下、上、右的操作。

6、dd:将光标所在行的内容删除。n dd:将光标所在行以及下面的n行内容删除。

dd + p:相当于剪切。

7、shift + ~:将字母进行大小写切换。

8、shift + r:进入替换模式。esc退出。

9、r:替换光标所在的字符。n r。

10、x or  shift + x:删除光标所在的字符。n x。

4、插入模式

从命令行模式到插入模式:

1、按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件。
2、按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字。
3、按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。

5、底行模式

底行模式下的命令:

1、set nu 或者 set nonu:调出或取消行号。

2、多屏操作

vs 文件名:就可以进入分屏操作模式。(光标在哪个分屏,就是可以操作的文件)。

ctrl +  w(按两次):切换操作屏。

w:写入       q:退出。

:!命令:可以执行Linux下的命令(ll,man,./a.out,g++等)。在底行模式下还可以输入命令进行编译(g++)和运行。

6、vim 的配置

没有配置的vim用起来其实和记事本并没有多大的区别,不能自动补齐,也不能自动缩进,使用起来不是很方便。所以vim实际上是需要配置的。

但是配置vim比较麻烦,配置的东西比较多,作为刚入门的我们并不知道需要配置哪些东西,所以我们直接在家目录下执行一键配置的命令即可:

curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh


二、编译器gcc/g++

1、概念

gcc(g++)是一个专门用来编译链接C语言(C++)的编译器。

gcc只能编译c语言,g++可以编译c语言和c++。

2、背景知识

程序翻译的过程,本质上是将文本的C语言或其他语言转成计算机能够识别的二进制。转换过程:

1、预处理:去注释,进行宏替换,头文件展开,条件编译等。
2、编译:生成汇编语言(将C语言等语言编译成汇编语言)。
3、汇编:将汇编语言转换成可重定向二进制目标文件。
4、连接:生成可执行文件或库文件。将多个 .o文件(Linux下) 或 .obj(Windows下) 文件合并形成一个可执行文件 .exe(windows下)。

注:编译过程为 扫描程序-->语法分析-->语义分析-->源代码优化-->代码生成器-->目标代码优化。
1、扫描程序进行词法分析,从左向右,从上往下扫描源程序字符,识别出各个单词,确定单词类型。
2、语法分析是根据语法规则,将输入的语句构建出分析树,或者语法树,也就是分析树parse tree或者语法树syntax tree。
3、语义分析是根据上下文分析函数返回值类型是否对应这种语义检测,可以理解语法分析就是描述一个句子主宾谓是否符合规则,而语义用于检测句子的意思是否是正确的。
4、目标代码生成指的是,把中间代码变换成为特定机器上的低级语言代码。

3、gcc/g++中的编译链接

同样地,gcc/g++下也需要像上面那样一步一步形成最终的可执行文件。

语法:gcc  要编译的文件  -o  自己命名的可执行文件。如下:绿色的就是可执行文件。

zdl.c中的内容:

代码里面有宏,有头文件,有注释,有条件编译,可以验证我们接下来的内容。 

1、预处理

但是,其实上面的做法是直接一步到位,直接形成了可执行程序。而我们为了验证gcc/g++是否会走上面的步骤,我们需要一步一步来看。所以我们要使用下面的命令:

gcc -E zdl.c -o test.i

-E:从现在开始,进行程序的翻译,如果预处理完成,就停下来。 

上面的命令表示我们将预处理完成之后形成的内容写到了一个临时文件 test.i。所以预处理的内容(还是C语言)就在test.i中。如下:

我们发现842行的宏被替换了,注释也没有了,条件编译也执行了,头文件也展开了。 

2、编译

接着我们执行下面的命令:将预处理完成的代码编译成汇编语言。

-S:从现在开始进行程序的翻译,如果编译完成,就停下来。

gcc -S test.i -o test.s

test.s就是汇编文件。

上图就是编译完成后汇编文件内容。 

3、汇编

然后我们执行下面的命令:

gcc -c test.s -o test.o

-c:从现在开始进行程序的翻译,如果汇编完成,就停下来。 

形成了二进制文件。test.o就是可重定向二进制目标文件。

我截取了其中一部分来看一看:

上图就是二进制文件的部分内容。 

4、链接

最后对可重定向二进制目标文件进行链接,使用如下命令:

gcc test.o -o  mytest

上图中,mytest就是最终的可执行程序,以及其执行结果。

4、函数库

首先,我们知道C/C++都有自己的标准库。

我们来看一个问题:在我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?

答案就是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。

这些库文件是现成的,是已经实现好了的,我们可以直接使用。当我们使用库中函数的时候,其中我们自己只是调用了该函数,没有真正地实现它,只有当链接的时候,对应的实现,才能和我们的代码关联起来。 

一般链接的过程,有两种方式:1、动态链接(要动态库)2、静态链接(要静态库)。

1、静态库

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”

静态链接:将库中方法的实现真的拷贝到我们的可执行程序中。

2、动态库

动态库是指在编译链接时,并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。

动态链接:将库中我要的方法的地址,填入我的可执行程序中,建立关联。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1210204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创新的Sui项目在CoinDCX的Unfold 2023黑客松中获奖

近日,在印度班加罗尔(Bengaluru),超过2500人参加了CoinDCX组织的综合性Web3活动Unfold 2023。作为讨论、聚会和活动的一部分,进行了一次多链黑客松,Sui联合赞助了该活动。所有团队,无论他们构建…

python 爬虫之urllib 库的相关模块的介绍以及应用

文章目录 urllib.request 模块打开 URL:发送 HTTP 请求:处理响应: 应用如何读取并显示网页内容提交网页参数使用HTTP 代理访问页面 urllib.request 模块 在 Python 中,urllib.request 模块是用于处理 URL 请求的标准库模块之一。…

CSS 实现新拟态(Neumorphism) UI 风格

什么是新拟态(Neumorphism) UI 风格?网上似乎还没有一个准确统一的定义。按照我个人的通俗理解,就是将界面的一部分凸起来,另一部分凹下去,形成的一种错落有致的拟物风格。代表作是乌克兰设计师 Alexander Plyuto 在各平台发布的新…

μC/OS-II---内存管理2(os_core.c)

流程---内存管理扩展 初始化μC/OS-II创建用户起始任务开始多任务调度统计Task创建用户应用程序任务 初始化μC/OS-II void OSInit (void) {OSInitHookBegin(); /* Call port specific initialization code */OS_InitMisc(); …

算法笔记-第七章-链表(未完成)

算法笔记-第七章-链表 链表的遍历链表结点的个数链表的头插法!链表删除元素链表反转例题思路一:原地反转思路二:头插法链表去除重复元素(有些复杂了)思路题目一题目二链表的遍历 #include<cstdio> const int N = 100; struct Node {int data, next;//表示的是当前数据和…

C++语言相关笔记

写在前面 记录一下C的要点&#xff0c;参考的书籍如下&#xff1a; 《C Primer Plus》是偏向教学的工具书&#xff0c;可以视为偏基础&#xff1b;《C Primer》 是偏向工程实践的工具书&#xff0c;可以视为偏进阶&#xff1b;《深度探索C对象模型》则针对C对象模型进行剖析&…

flutter背景图片设置

本地图片设置 1、在配置文件pubspec.yaml中&#xff0c;设置以下代码 assets:- assets/- assets/test/2、如果目录中没有assets文件夹&#xff0c;则创建一个文件夹&#xff0c;并且取名为assets&#xff0c;在此文件夹中存放图片资源即可&#xff0c;如果想分文件夹管理&…

golang中context使用总结

一、context使用注意事项 在使用context时&#xff0c;有一些需要注意的事项&#xff0c;以及一些与性能优化相关的建议&#xff1a; 避免滥用context传递数据&#xff1a;context的主要目的是传递请求范围的数据和取消信号&#xff0c;而不是用于传递全局状态或大量数据。滥用…

ElasticSearch 增删改查操作

本文主要是介绍 ElasticSearch 的文档增删改查和批量操作&#xff0c;同时会介绍一些 REST API 返回状态码的具体含义。 我们先来看下这个表&#xff1a; 这个表包含了 Index、Create、Read、Update、Delete 这五种方法&#xff0c;我们先来看下 CRUD 操作的 HTTP 请求都长什么…

美团拼图滑块

有时候放弃也是一种智慧。 就像这说的一样&#xff0c;美团的拼图滑块&#xff0c;不知道这个缺口该怎么去处理&#xff0c;正常划顶到最外面去了&#xff0c;所以就不知道这个是咋计算的。 先来看看他的这个加密&#xff0c;跟原来的一划到底其实是一样的&#xff0c;难度只是…

php+vue3实现点选验证码

buildadmin 中的点选验证码实现 验证码类 <?phpnamespace ba;use Throwable; use think\facade\Db; use think\facade\Lang; use think\facade\Config;/*** 点选文字验证码类*/ class ClickCaptcha {/*** 验证码过期时间(s)* var int*/private int $expire 600;/*** 可以…

萌宠俱乐部

一、html代码 二、CSS代码 三、效果图 四、继续努力呀&#xff01;&#xff01;&#xff01; 一、html代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"wi…

如何使用线性模型的【分箱】操作处理非线性问题

让线性回归在非线性数据上表现提升的核心方法之一是对数据进行分箱&#xff0c;也就是离散化。与线性回归相比&#xff0c;我们常用的一种回归是决策树的回归。为了对比不同分类器和分箱前后拟合效果的差异&#xff0c;我们设置对照实验。 生成一个非线性数据集前&#xff0c;…

Java计算数据百分比

public class CalculatePCT {public static void main(String[] args) {System.out.println(getPercent(9, 100));System.out.println(getPercent2(3, 7));}/*** 方式一&#xff1a;使用java.text.NumberFormat实现*/public static String getPercent(int x, int y) {double d1…

ACM练习——第二天

今天又是一天课&#xff0c;满课&#xff0c;很累哈&#xff0c;计组真的挺难的&#xff0c;但是多学学还是可以学明白。行吧&#xff0c;继续进入今天的ACM练习&#xff0c;现阶段都是主要练习Java到C的语言过渡。 因为今天的题目多半都是昨天的延伸&#xff0c;我就不提供Jav…

Java主流分布式解决方案多场景设计与实战

Java的主流分布式解决方案的设计和实战涉及到多个场景&#xff0c;包括但不限于以下几点&#xff1a; 分布式缓存&#xff1a;在Java的分布式系统中&#xff0c;缓存是非常重要的一部分。常用的分布式缓存技术包括Redis、EhCache等。这些缓存技术可以用来提高系统的性能和响应…

2023软件测试面试跳槽必备

你眼中的软件测试岗位是怎样的&#xff1f;大部分人可能会给出这样的回答&#xff1a;“测试&#xff1f;简单啊&#xff0c;没什么技术含量&#xff0c;无非就是看需求、看业务手册、看设计文档、然后点点功能是否实现&#xff0c;麻烦点的就是测试下部署安装是否出现兼容性问…

开讲:长江航道工程局举办首届云表无代码培训班

11月9日至10日&#xff0c;公司联合珠海乐图软件有限公司在总部机关举办了首届云表无代码编程开发初级培训班。公司所属单位工程、成本、财务等相关业务部门及项目部管理人员参加培训&#xff0c;公司总工程师张晏方作开班动员讲话。 张晏方指出&#xff0c;公司自主开发的云表…

java生成docx文档, docx文档动态饼图

背景: 最近接了个需求, 要求生成日报, 大概如下图所示: 其中*表示变量, 看到要动态生成doc给我难受坏了,为什么会有这种需求? 然后看到里面还要动态生成饼图, oh, no.........没有办法, 硬着头皮上吧. 于是就搜了下java生成docx的方式, 看到的, 比较靠谱的一种通过freemake…

【每日一题】1334. 阈值距离内邻居最少的城市-2023.11.14

题目&#xff1a; 1334. 阈值距离内邻居最少的城市 有 n 个城市&#xff0c;按从 0 到 n-1 编号。给你一个边数组 edges&#xff0c;其中 edges[i] [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边&#xff0c;距离阈值是一个整数 distanceThreshold。 …