vim是Linux下的一个多模式的编译器 简单来说就是写代码的工具 不提供编译调试等功能
有语法高亮功能 可视化操作不仅可以在终端运行 还可以运行与x windows mac os windows

1、命令模式
控制光标的移动 字符,字或行 的删除 ,移动复制某区段
以及切换到插入模式和底行模式下
2、插入模式(使用最频繁的模式)
只有在插入模式下 才可以进行文字的输入
以及切换到命令模式
3、底行模式
文件保存或退出 也可以进行 文件替换 找字符串 列出行号等
以及切换到命令模式

命令模式切换到插入模式
输入a:进入插入模式后 从目标光标所在位置的下一个位置开始输入文字
输入i: 进入插入模式后 从光标当前位置开始输入
输入0:进入插入模式后 插入新的一行 从行首开始输入文字
命令模式 切换到底行模式
输入shift+;
插入模式/底行模式切换命令模式
按ESC即可
插入模式和底行模式之间不能相互转换
h j k l 分别控制光标左下上右移动一格 也可以使用方向键进行移动G :移动到文章的最后gg:进入到文本开始$(shift+4):移动到光标所在行的行尾^(shift+6):移动到光标所在行的行首n+Enter:光标向下移动n行n+l:光标进去到改行的第n个位置ctrl+b :屏幕向前翻一页ctrl+f:屏幕向后翻一页ctrl+u:屏幕向前翻半页ctrl+d:屏幕向后翻半页w:光标进入到下个字的开头e:光标进入到下个字的自尾b:光标回到上个字的开头x:每按一次删除光标所在位置一个字符n+x:删除光标所在位置后面的n个字符X:删除光标所在位置前一个字符n+X:删除光标所在位置后前面的n个字符dd:剪切/删除光标所在行n+dd:从光标所在行开始剪切/删除n行p:将剪切的内容复制到光标所在位置下一行n+p:将剪切的内容复制到光标所在位置下一行开始复制n行yy:复制光标所在行到缓冲区n+yy:复制从光标所在行往下数n行字符到缓冲区p:将缓冲区的字符粘贴到光标所在位置下一行yw:将光标所在位置到字尾的字符复制到缓冲区n+yw:复制n个字到缓冲区r: 替换光标所在处的字符R:替换光标所在位置的字符 直到按下esc停止uuctrl+~:快速切换大小写u:撤销ctrl+r:恢复n+G:移动到第n行行首在使用底行模式之前 先按ESC键确定自己处于命令模式 然后再按shift+;进入底行模式
set nu:按回车后在文件中的每一行前列出行号set nonu:按回车后在文件中的取消列出的行号数字:按回车后就会跳转到该行行首w:保存文件w!:强制保存q:退出文件q!:强制退出文件wq:保存并退出文件vs+文件名:进行多文件操作ctrl+ww:光标在不同文件中切换!+其他指令 :在不退出vim的情况下执行Linux其他命令gcc/g++分别是GUN中的c和c++编译器
对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
对于 .c和.cpp文件,g++则统一当做cpp文件编译
在使用gcc之前 应该了解一个.c源文件到一个.exe可执行程序经历了哪些过程和函数库 # 程序编译链接的四个过程
完成头文件的展开 删去注释 宏替换等工作将源代码翻译成汇编语言 语法分析 词法分析 语义分析等汇编代码转换成为二进制指令产生目标文件将汇编过程产生的二进制指令进行连接 生成可执行程序gcc/g++ 选项 文件
常用选项:
-E :只进行预处理 不会生成文件 需要自己重定向到一个文件里
-S: 编译到汇编语言(生成.s文件) 不进行汇编和链接
-c:编译到目标文件 (生成.o文件) 不进行链接
-o:将执行结果输出到指定文件中
-static:对生成的文件采用静态链接
gcc -E -o test.i test.c
将源文件test.c进行预处理后停止 将是执行结果输出到test.i文件中

可以看到预处理阶段完成了头文件的展开 删去注释 宏替换等工作
gcc -S test.s
将预处理阶段产生的test.i文件编译产生.s汇编文件


gcc -c test.s
将汇编文件test.s编译成产生.o目标文件


gcc test.o
将目标文件链接产生可执行程序a.out

如果你也和我一样 不喜欢a.out 用-o进行重定向gcc -o test.exe test.o

可执行程序也是二进制指令

我们在c程序中,并没有实现printf函数,且在预编译中包含的头文件stiod.h中也仅仅只是有该函数的声明 并没有定以实现该函数 那么printf函数在哪里实现的呢?
在Linux中 系统把这些函数都实现在一个名为libc.so.6(Linux中的一个动态链接库 包含了标准c库的实现)的文件中 在没有特别指定时 gcc会到系统默认的路径’‘/usr/lib’'下进行查找,也就是链接到libc.so.6库函数中去 这样就能实现函数printf了 这也就是链接的作用
库函数一般分为静态库和动态库
file 命令
语法: file 文件名
功能: 辨识文件类型

gcc/g++在编译时默认采用动态链接 我们也可以加上-static选项使用静态链接的方式编译
gcc -o newtest.exe test.c -static

采用静态链接 可执行程序会比较大
我们也可以查看一个可执行程序所依赖的库(使用ldd命令)
ldd 命令
语法: ldd 可执行程序
功能: 查看一个可执行程序依赖的库



在使用make/makefile之前 先了解一下各个文件之间的依赖关系和依赖方法


在重新产生一个可执行程序时 都应该将之前生成可执行程序以及生成的文件进行清理 即项目是需要清理的
make clean命令是用来清除所有的目标文件 以便重新编译 像清除这种没有被第一个目标文件直接或间接关联 那么他后面所定义的命令将不会被自动执行

一般这种clean的目标文件 直接将他设置位伪目标 .PHONY修饰,为目标的特性是可以强制执行


gdb 可执行程序:进入调试ctrl+d 或者 q:退出调试
list/l 行号:显示指定行之后的源码 每次显示10行list/l 函数名:显示函数的源码
b 行号 :在指定行设置断点b函数名:在指定函数开头设置断点
info b :查看自己打的断点信息
d breakpoints:删除所有断点d 断点编号 :删除对应的断点
disable 断点编号 :禁用断点enable 断点编号:启用断点
r(run) :运行程序n(next):单条执行、逐过程执行 与vs中调试器的F10一样s(step):进入函数调用 逐语句执行 与vs中调试器的F11一样

p (print) 变量名/&变量名 :显示变量的值或地址display 变量名/&变量名:一直显示变量的内容或地址undisplay 编号取消一直显示变量的内容或地址
c(continue):从一个断点运行到下一个断点finsh:将一个函数运行结束就停下来until :直接运行到指定行

set var :修改一个变量的内容(不用修改源代码 进行多分支测试)