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三个源文件
内容分别为
输入ctags - R在当前目录下面创建一个索引
打开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文件中编辑如下
或者
运行Makefile
make
清除Makefile产生的多余文件
make clean
注意事项:
1、编写依赖方式时,一定要以Tab键开头(不能用空格代替)
2、clean一般都放在文件的最后
3、@可以屏蔽输出依赖方式
4、makefile 默认值生成一个目标文件,就停止
在Linux下编写一个简单的进度条
在编写之前先来了解一个奇妙的现象,有"\n"
运行结果为:
hello world早早运行完毕但是2秒之后程序才会运行完毕
运行结果
系统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)给人复制的效果
每输出一次,程序挂起一段时间
实现代码
效果