contiki里有很多基础的数据结构和对应的操作函数,比如说内存管理memb,列表list 队列queuebuff等等。如果不把这些最基础的东西啃下的话,你去看上层的协议比如说ipv6 ,rpl等,那是寸步难行,根本不知道在干嘛。接下来打算把这些数据结构挨个过一遍。接下来翻list的源码吧。
/***************************list.h**********************************/
#define LIST_CONCAT2(s1, s2) s1##s2
#define LIST_CONCAT(s1, s2) LIST_CONCAT2(s1, s2)
这两个宏就是用来拼接的,待会就会看到怎么用。
#define LIST(name) \
static void *LIST_CONCAT(name,_list) = NULL; \
static list_t name = (list_t)&LIST_CONCAT(name,_list)
这个宏用来定义两个跟链表有关的指针,用一开始LIST_CONCAT宏展开的话就是
static void* name_list = NULL
static list_t name = (list_t)&name_list
这个list_t又是啥,追踪下去发现是typedef void ** list_t;也就是说定义了一个指针叫name_list,还有一个指向指针的指针name
#define LIST_STRUCT(name) \
void *LIST_CONCAT(name,_list); \
list_t name
这宏定义跟上面的很像,关键就是少了个static,看注释上也是说上面的宏定义的是模块内部使用的静态变量,这个宏定义的是全局。其实还不仅如此,我搜了一下用到这个宏的地方,在uip-ds6-route.h里有,如下
struct uip_ds6_route_neighbor_routes {
LIST_STRUCT(route_list);
};
而LIST这个宏在nbr_table.c里是这样的
LIST(nbr_table_keys);
也就是说用LIST的时候定义的是两个零散的变量,用LIST_STRUCT的时候变量是被装在一个结构体里的。好,接着往下看。
#define LIST_STRUCT_INIT(struct_ptr, name) \
do { \
(struct_ptr)->name = &((struct_ptr)->LIST_CONCAT(name,_list)); \
(struct_ptr)->LIST_CONCAT(name,_list) = NULL; \
list_init((struct_ptr)->name); \
} while(0)
这个宏呢就是用来给LIST_STRUCT宏定义的结构体初始化用的。这样看可能不是很清楚这个宏的原理,结合实例看就明白了。在uip-ds6-route.c里有如下语句
struct uip_ds6_route_neighbor_routes *routes;
LIST_STRUCT_INIT(routes, route_list);
uip_ds6_route_neighbor_routes就是包含了LIST_STRUCT的结构体类型。list_init((struct_ptr)->name)这句感觉是多余的,跟
(struct_ptr)->LIST_CONCAT(name,_list) = NULL是一样的。
接下来老规矩,就是一堆针对这个list数据结构的操作函数声明了。
void list_init(list_t list);
void * list_head(list_t list);
void * list_tail(list_t list);
void * list_pop (list_t list);
void list_push(list_t list, void *item);
void * list_chop(list_t list);
void list_add(list_t list, void *item);
void list_remove(list_t list, void *item);
int list_length(list_t list);
void list_copy(list_t dest, list_t src);
void list_insert(list_t list, void *previtem, void *newitem);
void * list_item_next(void *item);
#endif /* LIST_H_ */
你可能觉得怪怪的,这个list结构体有点空荡荡的,就一个指针还有一个指向这个指针的指针,就两个变量而已,算什么列表?别急,看了list.c就会明白,这个list的适用面很广,设计得很灵活。

contiki之list头文件相关推荐

  1. OpenCV 笔记(05)— opencv.hpp 头文件作用(是其它所有头文件的全集)

    在编辑器中通过点击 #include "opencv2/opencv.hpp" 头文件就可以看到该头文件的定义如下 #ifndef OPENCV_ALL_HPP #define O ...

  2. linux 下根据cpp文件快速书写头文件

    假设我们现在有一个hello.cc文件,我们如果想要书写它的头文件hello.h,使用如下的命令即可: cat hello.cc | grep "^\w.*)$" > hel ...

  3. C++ .h(头文件) 与 .cpp(源文件) 的使用

    .h 文件: .h是头文件 ,里面主要是写类的声明(包括类里面的成员和方法的声明).函数原型.#define常数等, 注意.h文件写的时候有特定的格式就是开头和结尾 #ifndef TEST_HEAD ...

  4. #includebits/stdc++.h包含C++的所有头文件

    研究题解看见别人用这个函数,然后就能直接用vector,set,string那些函数了,摸不着头脑,感觉特神奇就百度了一下,才发现这个是C++版本升级,然后文件自带的,方便了程序员吧.不然每次都得敲那 ...

  5. C++ 笔记(25)— 理解 C++ 中的头文件和源文件的作用

    1. C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件: .cpp 文件,被称作 C++ 源文件,里面放的都是 C++ 的源代码 .h 文件,被称作 C++ 头文件,里面放的也是 C++ ...

  6. C++ 笔记(02)— 程序结构(头文件说明、命名空间、函数返回值、函数参数、注释、语句结束符、cin/cout)

    先看以下代码 #include <iostream> #include <string> using namespace std;int main() // main() 是程 ...

  7. ++项目 cmake头文件路径_CMAKE入门实战

    0.导语 最近做的项目使用CLION构建,而这个采用CMakeLists.txt管理,因此为了更好的学习,故找到了一篇大牛级别的入门文章,有文章有代码,本文是花了一点时间把这篇文章学习后的重要点记录吧 ...

  8. Linux找头文件规则,linux 头文件、库文件查找顺序

    linux 头文件.库文件查找顺序 默认分类 2009-11-14 01:24:28 阅读126 评论0 字号:大中小 linux 头文件.库文件查找顺序 2009-11-03 12:36 Inclu ...

  9. strstr函数头文件_C语言(函数)学习之strstr strcasestr

    一.strstr函数使用 [1] 函数原型 char *strstr(const char *haystack, const char *needle); [2] 头文件 #include [3] 函 ...

最新文章

  1. linux 测试环境启用jar_Linux下用java -jar运行可执行jar包的方法教程
  2. Datawhale组队学习周报(第010周)
  3. 思维导图学 Linux Shell攻略之小试牛刀篇
  4. 关于ADB 执行报错问题-db server version (31) doesn't match this client (40); killing...
  5. 说说大型高并发高负载网站的系统架构(ZT)
  6. QSplitter设置宽高比例的正确方法
  7. 对话诺奖得主:科学离不开国际合作
  8. c语言新龟兔赛跑_幽默 | 新龟兔赛跑
  9. fatal: Could not read from remote repository.
  10. android遥控器:控制电脑上的暴风影音播放(C#作为服务端)
  11. 基于Python实现仿Windows标准计算器
  12. 大白菜pe 通用pe 安装心得
  13. 数据文件offline online
  14. ABAP 去重 delete adjacent duplicates
  15. Uni-app 实现离线打包 安卓篇
  16. iview在table中添加图片
  17. linux运行openfoam,OpenFOAM应用的准备工作
  18. Bos物流项目之在线下单流程图
  19. 我的Crystal xcelsius之旅
  20. python正则表达式入门_python入门_常见正则表达式匹配

热门文章

  1. 2022-6-25 12点 程序爱生活 恒指选择继续向上震荡,而且等来了推动前期上涨原因的一个消息:港股的ETF通过港股通可以交易
  2. 关闭、清除IBM小型机橙色告警灯方法
  3. python实现jacknife交叉验证
  4. 猿创征文|Android 11.0 12.0Launcher3中app列表页的app名称分两行显示
  5. java多线程并发基础汇总一
  6. 5分钟就能做一个Excel动态图表,你确定不学学?(纯gif教学)
  7. 论文解读:《功能基因组学transformer模型的可解释性》
  8. cad抛物线曲线lisp_CAD如何画抛物线啊?
  9. Linux后台日志定时清理脚本
  10. 事务的四大特性-ADID特性