小火坤们,俺又来了,今天我们来讲讲vim、gcc、make/Makefile,顺便做一个小程序【进度条】。
目录
一、vim:
在学任何东西之前,我们肯定有一个疑惑:“这个东西是什么?”vim实质上是一个多模式编辑器。
1.vim的基本模式:
vim分为三种模式:命令模式、插入模式、底行模式,那么这三种模式分别是什么作用呢
上图为三种模式切换指令
①命令模式:大多数的操作指令都是在命令模式下进行(vim进入后的默认界面)
②插入模式:进入该模式后可以任意对内容进行编辑
③底行模式:少量的操作指令,主要用来退出vim编辑器
2.vim三种模式的基本操作:
①命令模式:
* 移动光标:
* * G(Shift g):移动到文章最后
* * gg:移动到文章开头
* * $:移动到光标所在行的行尾
* * ^:移动到光标所在行的行首
* * w:移动到下个单次的开头
* * e:移动到写个单词的结尾
* * b:返回到上个单词的开头
* * #l:移动到改行的第#个位置
* * ctrl b/f/u/d:屏幕 向后/向前 移动一页,屏幕 向后/向前 移动半页
* 删除文字:
* * x/#x:删除光标所在位置的字符/删除光标所在位置之后的#个字符(包括自己)
* * X/#X:删除光标所在位置前 1个/#个 字符
* * dd/#dd:删除光标所在行/从光标所在行开始向下删除一共#行
* 复制:
* * yw/#yw:将光标所在之处到字尾的字符复制到缓冲区/从光标所在之处开始复制#个单词到缓冲区
* * yy/#yy:将光标所在行复制到缓冲区/从光标所在行开始向下复制#行到缓冲区
* 粘贴:
* * p:将缓冲区的字符粘贴到光标所在位置
* 替换:
* * r:替换光标所在之处的字符
* * R:替换光标所到之处的字符,直到按下[Esc]结束
* 撤销与恢复:
* * u:撤销
* * ctrl r:恢复
* 跳至指定行:
* * ctrl g:显示光标所在行的行号
* * #G:将光标移动至文章第#行行首
②插入模式:
* * i:从光标位置开始编辑
* * a:从光标下一个字符位置开始编辑
* * o:从光标下一行位置开始编辑
③末行模式:
* * set nu:显示行号
* * #:跳转至#行
* * /关键字:查找关键字,按 n 继续查找下一个
* * w:保存
* * q:离开
* * wq(!):保存并离开(强制)
3.命令模式的操作(必须要知道的知识点!!!):
在命令模式下,我们移动光标和输入数字要用到的是:h j k l 按键(左 下 上 右)与字母按键上方的数字按键。
二、gcc:
gcc是Linux下的一个编译器,我们知道我们对一个文件编译(暂且称之为 源文件),一定会生成另一个文件(目标文件)。那么,gcc编译的操作指令如下:
gcc -o 目标文件(生成文件) -编译指令 源文件
1.从源文件到可执行文件
现在让我们来回顾一下源文件到可执行文件需要经历的阶段吧!我也会顺便将gcc对应的编译指令放入其中:
①预处理:
进行宏替换、条件编译、去注释等等(编译指令:-E , 生成文件后缀:.i)
②编译:
对代码的规范性进行检查,检查代码是否有语法错误。检查无误后把代码翻译成汇编语言(编译指令:-S , 生成文件后缀:.s)
③汇编:
把编译阶段生成的汇编文件转换为目标文件(编译指令:-c , 生成文件后缀:.o)
④链接:
链接阶段,生成可执行文件或库文件(编译指令:无 , 生成文件后缀:无 )
我们在敲代码的过程中常常会用到函数(不是我们自己编写的),例如”printf、scanf”等,那么大家有没有想过,这些函数既不是我们写的,也不在我们的头文件中,那么我们在编译时是从哪里进行链接生成可执行文件的呢?请看下面函数库的介绍
2.函数库:
实际上,好多我们在用的函数,这些函数实现都做到名为libc.so.6的库文件中,这也是系统默认的搜索路径,所以我们的代码会链接到对应的库。那么问题又来了,这个库不在我们的头文件中,而我们有时自己编写的函数会放在我们的头文件中,这两者有何区别?请继续看下去:
3.静态库与动态库:
①静态库:静态库就是在编译链接时,把库文件的所有代码加入到可执行文件中,所以生成的文件比较大,但是运行时不需要库文件了(静态库后缀为:.a)
②动态库:动态库与之相反,文件在编译链接时并没有把库加入到可执行文件中,而是在运行时链 接文件加载库,可以节省协同开销(动态库后缀为:.so)
类比:给大家讲个小故事做类比,我们可以想象自己准备上网打游戏,那么我们有两种选择:(1)自己在家配置好所有的设施,包括但不限于:主机(CPU、显卡...)、显示器、键盘、鼠标、网线、外部环境,费时费力费空间,但是稳定(2)找到一条通往网吧的路线,进入到网吧里找到自己需要的位置,直接上网打游戏,省时省力省空间,由于依赖于外部所以不够稳定
相信大家已经对 gcc 有了更深入的认识,那么还有个问题哦,我们生成可执行文件要进行操作(gcc -o xxx -? xxx),如果只操作一次还好,但是敲代码的”程序猿”都知道,代码是不可能只写一次的,抛开修正错误不谈,如果需要增加新的功能等等,那么我们还要修改源代码并重新生成可执行文件,那每次都要敲 gcc 指令会很容易出错,因此,再介绍make/Makefile给大家认识!
三、make/Makefile:
make/Makefile是Linux项目自动化工具,使用方法如下:
make实质上是一个指令,Makefile实质上是一个文件。那么make这个指令是对谁发号施令呢?Makefile这个文件存在的价值是什么呢?相信大家已经知道了,make是对Makefile发号施令,而Makefile文件内写的就是要执行的操作。
上图为Makefile文件的内容
上图为 使用make指令将run.c编译为可执行程序
这样一来,我们在想gcc时只需要执行简单的make指令就可以了!
四、Linux小程序 -- 进度条:
在做这个程序之前,大家要弄清楚 \n和\r 以及 缓冲区 是什么。
1.\r -- 回车符,\n -- 换行符。
看到这里,大家脑袋里可能会有”???”闪过:”回车不就是换行了吗?为什么又冒出来个换行符?”实则不然,回车实际上指的是回到一行的开始位置(最左边),换行实际上指的是平移到下一行。所以,我们平时在键盘上按的”enter”其实是包含了”\n \r -- 回车&&换行” 。
2.缓冲区:
先告诉大家,CPU是电脑最核心(最值钱)的部分,那么CPU在运行时从哪里读取数据呢?显而易见,是 缓冲区。那么问题来了:”为什么要从缓冲区读取数据呢?为什么不能从磁盘这种外部设备中直接读取呢?”这时因为CPU从缓冲区中读取数据的速度远远大于从磁盘中读取数据的速度,所以,缓冲区先存储磁盘中的数据,然后CPU从缓冲区读取数据,缓冲区再继续存储磁盘中的数据,周而复始,这样一来减少了CPU访问磁盘的次数,也就大大提高了计算机的运行速度。
3.编写进度条小程序
现在让我们来编写进度条吧!
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<string.h>
4 int main()
5 {
6 char bar[101];
//初始化字符串
7 memset(bar,0,sizeof(bar));
8 int i = 0;
//创建转动图标,\\用的是转义字符
9 const char* load="|/-\\";
//循环次数为101次
10 while(i<=100)
11 {
//进度条打印宽度固定,\r回车符--将数据放入缓冲区后光标重新回到最左边准备存入数据
12 printf("您的好运:[%-100s][%d%%][%c]\r",bar,i,load[i%4]);
13 bar[i++] = '#';
//清空输出缓存区---将缓存区的内容打印出来
14 fflush(stdout);
//短暂停留,单位为毫秒
15 usleep(100000);
16
17 }
18 printf("\n加油哇!!!\n");
19
20
21
22 return 0;
23 }