c语言-1

146 阅读1分钟

在学习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)是一个右移位表达式;