我的老师让我们使用以下预处理器宏在C中实现链接队列。这个想法是你通过让它不保存数据来使你的队列通用,然后你在其他地方有一个包装器结构,它保存队列中的节点,以及属于它的数据片段。
下面的宏从队列中获取一个节点(即node),wrapper结构的类型(即struct Wrapper),以及Wrapper的队列节点元素的名称(即qnode(Wrapper有一个叫做qnode的元素))。
然后宏返回包含传入的节点的struct Wrapper。
所以调用看起来像这样:
queue_entry(node, struct Wrapper, qnode)
这在我看来非常酷,而且效果很好,(看看我的老师是怎么写的,最好!)。但我希望有人可以向我解释它实际上是如何工作的?因为我对幕后实际发生的事情一无所知。
宏:
#define queue_entry(NODE, STRUCT, MEMBER) \
((STRUCT *)((uint8_t*)(NODE) - offsetof(STRUCT, MEMBER)))