ctags

ctags是vim下方便代码阅读的工具。尽管ctags也可以支持其它编辑器,但是它正式支持的只有VIM。并且VIM中已经默认安装了Ctags,它可以帮助程序员很容易地浏览源代码。(尤其是大型的工程)

一、安装ctags

1、命令行安装

切换到root用户之下,输入yum install ctags

2、下载源码安装(网上提供的方法)

       1)从http://ctags.sourceforge.net/下载源代码包后,解压缩生成源代码目录,

       2)然后进入源代码根目录执行./configure,

       3)然后执行make,

       4)编译成功后执行make install


二、简单的使用

        1)ctags-R:在当前目录下建立索引

        2)Ctrl + ](右方括号) :跳转到函数或变量的定义处

        3)Ctrl + T :跳转至上级

例如:

一个工程中含有my_tags.h、ctags.c、main.c三个源文件

内容分别为

wKiom1dJT9HBXS9qAACcGH-hhaM903.png

输入ctags - R在当前目录下面创建一个索引

wKioL1dJUayC7T8yAABWuigz-LA489.png

打开main.c或者my_tags.h,将光标放到fun处,按ctrl + ]即可跳转到函数定义处

再按ctrl +T跳转 至上级


Makefile

        会不会写makele,从一个侧面说明了一个人是否具备完成大型工程的能力。 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makele 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makele就像一个Shell脚本一样, 其中也可以执行操作系统的命令。makele带来的好处就是——“自动化编译”,一旦写 好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。


make是一个动作而Makefile是一个文件

make命令执行时,需要一个 Makele 文件,以告诉make命令需要怎么样的去编译和链接程序。

 

Makefile文件中主要是文件的依赖关系和依赖方式。

  在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以Tab键开头。make并不管命令是怎么工作的,他只管执行所定义的命令。

  make是如何工作的?

  (1) make会在当前目录下找名字叫“Makefile”或“makefile”。

  (2) 如果找到,它会找文件中的第一个目标文件.o。

  (3) 如果文件不存在,它会根据依赖关系找.s文件。

  (4) 若.s文件不存在,make会在当前文件中找目标为.s文件的依赖性即.i。

  (5) 若.i文件不存在,根据依赖关系会找.c文件,当然.c文件时存在的啦。于是,make会生成一个.o文件,然后去执行文件。


  这就是整个make的依赖性,make会一层一层去找文件的依赖关系,直到最终编译出第一个目标文件。在找的过程中,如果出错,如:最后被依赖的文件找不到,make会直接退出,并报错,对于定义的命令的错误或者编译不成功,make不管。make只管文件的依赖性,即如果找到依赖关系之后,冒号后边的文件不存在,make也不工作。


  清理目标文件的规则:

  每一个Makefile中都应该写一个清理目标文件(.o和执行文件)的规则,这不仅便于重编译,也有利于保持文件的清洁。

  .PHONY:clean

  clean:

       rm -f 文件

  .PHONY后边的clean事宜“伪目标”。在rm命令前面加上一个小减号的意思是,就算某些文件处理问题,不要管,继续做后边的事情。不要将clean的规则放到文件的开头,不然出成为make的默认目标。

例如:为proc.c编写一个Makefile

在proc.c当前目录下创建一个Makfile文件,并在Makefile文件中编辑如下

wKiom1dJW4ajv2fkAABhU0bH99Q615.png

或者

wKiom1dJXEbQ0VL1AAA-dOe150Y344.png

运行Makefile

make

wKioL1dJXcWxsz3nAABLJpXGgX4905.png

清除Makefile产生的多余文件

make clean


注意事项:

1、编写依赖方式时,一定要以Tab键开头(不能用空格代替)

2、clean一般都放在文件的最后

3、@可以屏蔽输出依赖方式

4、makefile 默认值生成一个目标文件,就停止



在Linux下编写一个简单的进度条

在编写之前先来了解一个奇妙的现象,有"\n"

wKiom1dJX3TDRfmVAAAcNVYrJBc447.png 


运行结果为:

wKioL1dJYOWykJ3EAAAzhCC5hOE726.png


hello world早早运行完毕但是2秒之后程序才会运行完毕 


wKiom1dJYQugKQoiAAAfNQiy33A322.png


运行结果

wKioL1dJYriyTp6_AAAiWR9pSHM411.png

系统2秒之后才会输出hello world


这是为什么呢?

注意:'\n'回车并换行,执行printf时先写到行缓冲,遇到\n的时候将行缓冲的内容刷出 

所以第一个程序中是先输出hello world然后再休眠,第二个程序中,由于没有'\n',所以不会输出hello world,当程序运行完毕之后,系统会自动刷新缓冲区,这时才会输出hello world。


进度条实现原理


1)实现动态的增长

可以定义一个数组,并设置一个计数器,当数字增加的同时,给字符数组每次增加一个元素,并且打印时覆盖之前的数组。

2)保证打印信息在同一行

每次将光标定位到最左边,从光标处打印,使用’\r‘,回车

3)复制动态的效果实现

定义一个数组

char index[4] = {'|', '/', '-', '\\'};

index[count%4];

4)实现打印长度相同

%-100s 

5)给人复制的效果

每输出一次,程序挂起一段时间


实现代码

wKiom1dJaBrBCm9KAACAoPx7R5A440.png


效果

wKiom1dJaGmwMQf4AAAwK2KDu3c702.png

wKiom1dJaHyCqj1qAAASVjRgXQE063.png