vim是一个多模式编辑器,这里主要介绍三种:命令模式(command mode)、插⼊模式(Insert mode)和底⾏模式(last line mode)
进入vim后默认的模式:命令模式
退出vim:
在命令模式下,按i:换到插入模式
在插入模式下不能直接退出,可以先按键盘左上角的ESC键,退回到命令模式
然后输入两次大写的ZZ进行退出。
还有就是切换到底行模式退出,用shift+;(其实就是:),然后按q退出
如果里面写了内容,就输入wq,保存并退出。
设置行号:在底行模式下输入set nu
底行模式回退到命令模式: 按键盘左上角的ESC键
但是我们不可以直接从底行模式切换到插入模式,从插入模式切换到底行模式也不可以,只能通过命令模式切换。
命令模式就是快速编辑
如果只想要光标上下左右移动,有2种方法:
上面的命令都可以带n。
yy和p前面都可以带n,进行批量化复制粘贴。
u 和 ctrl + r互为对方的撤销,撤销操作一旦退出文件,就无法进行撤销操作了,但是如果只是保存,没有退出,就可以撤销。
批量化增加操作:以注释为例
在不能撤销的情况下,批量化删除操作:以取消注释为例
进入插入模式:
这个模式就是编写内容的,没有啥特别的
进入底行模式:冒号:(shift+;)
我们再分别对程序翻译的4个步骤展开学习,以下面这个程序为例。
1 #include <stdio.h>
2 #define M 5
3 #define N 100
4 int main()
5 {
6 //注释xxxxxxxxx
7 for(int i = 0; i < M; i++)
8 {
9 printf("hello world!\n");
10 }
11
12 #ifdef N
13 printf("N = %d\n", N);
14 #else
15 printf("No N");
16 #endif
17 return 0;
18 }
程序翻译的4个步骤:
-E这个选项的意思就是:开始进行程序翻译,在预处理做完时就停下来,不用再往后执行了。
我们用vim打开这个code.i文件,会发现代码变得特别多。
从这个文件就能看出预处理阶段会把头文件展开,去掉注释,宏替换,条件编译。
预处理的本质就是修改编辑我们的文本代码 ;code.i里的内容此时还是C语言。
-S选项意思就是:开始进行程序翻译,在编译做完时就停下来,不用再往后执行了。
-c选项意思就是:开始进行程序翻译,在汇编完成就停下来,不用再往后执行了。
此时这个code.o文件就已经是二进制文件了,打卡这个 code.o文件看到的就是一堆乱码。
不带-o选项的话,默认生成的是同名.o文件
有多个.o文件时,我们可以把所有的.o文件一起进行gcc,让他们整体形成一个可执行程序。
以下面这段代码为例
#include <stdio.h>
int main()
{
#ifdef M
printf("免费版\n");
#else
printf("专业版\n");
#endif
}
此时没有宏定义,输出结果为"专业版"
宏定义M默认取值为1,可以用 -DM=n 让M取值为n
库就是一套方法或者数据集,为我们开发提供最基本的保证(基本接口、功能、加速我们二次开发)
前面的代码我们所依赖的C语言的c标准库就是这个
用 ls -l 查看这个库,就会出现这个绿色的文件 libc-2.31.so
C语言里的类似printf的实现就是在这个库里保存的,用的时候就要到这个库里执行然后再返回。
动静态库对比:
可以看到gcc编译连接方法是默认是动态连接的,动态链接的前提是这个库存在
然后再用file查看库详细信息时,就会发现连接方法变成了静态链接,而且内存也变大了。
而且静态链接时,用ldd查这个可执行文件依赖的库是查不到的。
我们也可以找c++的动态库和静态连接