先来看这样一段代码:
typedef struct _tTask { tNode delayNode; uint32_t prio; uint32_t state; }tTask;
tTask task1;
假设知道了task1.delayNode的地址,怎么反推task1的地址?
如果delayNode定义在task1开头,显然它们俩地址是一样的,这只是一种特殊的情况,如果delayNode放在中间呢?
#define tNodeParent(node, parent, name) \ (parent *)((uint32_t)&((parent *)0)->name)
所以就可以写成
tNodeParent(node, tTask, delayNode)