在学习redis源码过程中,遇到一些不明白的C语言语法规则,做一些记录
1、#define
一个预处理器,用于定义宏,使用如下
#define 标识符 常量
就是用一个标识符表示一个常量(数字、字符、字符串、表达式)
通俗点将就是在编译前会用常量替换前面的标识符,然后再进行编译
2、##
连接符号;举例如下
#define FUN(arg) my##arg
FUN(abc)等价于myabc
3、struct
用来定义结构体;
这里说一种指向结构的指针,形式如下:
struct Books *struct_pointer;
4、下面解读一下redis源码中sds.h中定义的几个宏
#define SDS_HDR_VAR(T,s) struct sdshdr##T *sh = (void*)((s)-(sizeof(struct sdshdr##T)));
#define SDS_HDR(T,s) ((struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T))))
#define SDS_TYPE_5_LEN(f) ((f)>>SDS_TYPE_BITS)
根据宏的定义,可以找出SDS_HDR_VAR(T,s)、SDS_HDR(T,s)、SDS_TYPE_5_LEN(f)都是标识符
struct sdshdr##T *sh = (void*)((s)-(sizeof(struct sdshdr##T)));这个咱们分开
说,struct sdshdr##T *sh是一个标准的结构体指针,后面的就是要得到实际保存字符的内存地址的指针
((struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T)))),这个只是一个指针
((f)>>SDS_TYPE_BITS)是一个右移位表达式;