总结:
1、
【头文件和源文件之间,来回编写】
测试框架的整体编写过程,根据“声明放头文件,定义放源文件”的原则,在头文件和源文件之间,来回编写;特别地,例如创建数据结构(链表),需要创建新的头文件;
2、
【在测试框架中,数组和链表的作用差距体现在哪呢?】
数组的大小,在程序运行之前,就已经提前被确定下来了,例如大小为100的整型数组,大小为400的字符串,大小为800的浮点型数组等等;
而链表的节点数目是随着程序的运行而逐个逐个确定的。
链表,如果新增一个元素,新增一个节点;新增100个元素,新增100个节点。
因此,可以让测试用例的数目,不受到数组大小的限制。
3、
【让任意一个结构,附带链表性质】
我们可以让任意类型,拥有链表这个特性;也可以把不同类型的节点,穿成一串;
任何一个结构,不是链表形态,没关系;在最后一个字段放一个LinkNode即可。
马上可以支持链表操作,就像一个外骨骼一样。这是一个十分优美的设计!
4、
【计算偏移量和首地址】
在T类型中的int偏移量是多少?
首先将0(零)地址,转成T*地址
再引用T*地址的Name字段
再去取这个字段的地址
再把地址强转long long————就是当前这个地址的偏移量。//64位操作系统的地址,就是long long类型,8字节;
代码如下:
#define offset(T, name) ((long long)(&(((T *)(0))->name)))
如何通过下一个节点的地址,去确定下一个结点的头地址?
先把p转成char *类型地址
减去相关偏移量offset(T, name)
再强转成T *类型————这就是下一个节点的首地址
#define Next(p, T, name) ((T *)(((char *)p) - offset(T, name)));