vim gcc make/Makefile、小程序进度条

  小火坤们,俺又来了,今天我们来讲讲vim、gcc、make/Makefile,顺便做一个小程序【进度条】。

目录

一、vim:

  1.vim的基本模式:

 2.vim三种模式的基本操作:

 3.命令模式的操作(必须要知道的知识点!!!):

二、gcc:

 1.从源文件到可执行文件

 2.函数库:

三、make/Makefile:

四、Linux小程序 -- 进度条:

 1.\r -- 回车符,\n -- 换行符。

 2.缓冲区:

 3.编写进度条小程序


一、vim:

 在学任何东西之前,我们肯定有一个疑惑:“这个东西是什么?”vim实质上是一个多模式编辑器。

  1.vim的基本模式:

  vim分为三种模式:命令模式、插入模式、底行模式,那么这三种模式分别是什么作用呢


vim gcc make/Makefile、小程序进度条_第1张图片

                           上图为三种模式切换指令

  ①命令模式:大多数的操作指令都是在命令模式下进行(vim进入后的默认界面)

  ②插入模式:进入该模式后可以任意对内容进行编辑

  ③底行模式:少量的操作指令,主要用来退出vim编辑器

 2.vim三种模式的基本操作:

  ①命令模式:

  * 移动光标

  * *  GShift 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文件内写的就是要执行的操作。

vim gcc make/Makefile、小程序进度条_第2张图片

                                                         上图为Makefile文件的内容

vim gcc make/Makefile、小程序进度条_第3张图片

                                            上图为 使用make指令将run.c编译为可执行程序

  这样一来,我们在想gcc时只需要执行简单的make指令就可以了!

四、Linux小程序 -- 进度条:

 在做这个程序之前,大家要弄清楚 \n和\r 以及 缓冲区 是什么。

 1.\r -- 回车符,\n -- 换行符。

  看到这里,大家脑袋里可能会有”???”闪过:”回车不就是换行了吗?为什么又冒出来个换行符?”实则不然,回车实际上指的是回到一行的开始位置(最左边),换行实际上指的是平移到下一行。所以,我们平时在键盘上按的”enter”其实是包含了”\n \r -- 回车&&换行” 。

 2.缓冲区:

  先告诉大家,CPU是电脑最核心(最值钱)的部分,那么CPU在运行时从哪里读取数据呢?显而易见,是 缓冲区。那么问题来了:”为什么要从缓冲区读取数据呢?为什么不能从磁盘这种外部设备中直接读取呢?”这时因为CPU从缓冲区中读取数据的速度远远大于从磁盘中读取数据的速度,所以,缓冲区先存储磁盘中的数据,然后CPU从缓冲区读取数据,缓冲区再继续存储磁盘中的数据,周而复始,这样一来减少了CPU访问磁盘的次数,也就大大提高了计算机的运行速度。

 3.编写进度条小程序

现在让我们来编写进度条吧!

  1 #include
  2 #include
  3 #include
  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 }

你可能感兴趣的:(vim,编辑器,linux)