Redis
-Source-code-learning
如果这篇文章帮助到了大家,希望大家能够帮忙点赞~
Pre-learning
在开始阅读redis源代码时候,发现成熟的项目都用了很多预处理指令,只好先学一下
预处理指令
以#开头的代码行,#必须是除了任何空白字符以外的第一个字符,#后是指令关键字,整行语句构成一条预处理指令,在编译器进行编译前有预处理程序对源码进行某些转换
#include
- 使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的include目录),而不在当前源文件目录去查找
- 使用双引号则表示首先在当前源文件目录中查找,若未找到才到包含目录中去查找
- 文件包含允许嵌套
宏的定义
#define 标识符 字符串
无参数宏
程序并不为宏分配内存空间,只是在预处理的时候进行简单的字符串替换
例:
#define ptr (int *);
ptr p1,p2;
在进行宏替换后上述代码为
#define ptr (int *);
int *p1,p2;
此时p1为指针,p2为整数(此时用typedef不会出现这样的错误)
无参宏注意事项:
- 宏名一般用大写字母表示,以便于与变量区别。
- 宏定义末尾不必加分号,否则连分号一并替换。
- 宏定义可以嵌套。
- 可用#undef命令终止宏定义的作用域。
- 使用宏可提高程序通用性和易读性,减少不一致性,减少输入错误和便于修改。如数组大小常用宏定义。
- 预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
- 宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
- 字符串" "中永远不包含宏,否则该宏名当字符串处理。
- 宏定义不分配内存,变量定义分配内存
带参数宏
带参数宏最好在字符串中将参数用括号括起来,防止因为参数是表达式,再简单的字符串替换后因为计算优先级导致的结果错误
#define 宏名(形参) 字符串
#define SQUARE(x) ((x)*(x))
int Square(int x){
return (x * x);
}
int main(void){
int i = 1;
while(i <= 5)
printf("i = %d, S