【发布时间】:2012-12-02 02:53:13
【问题描述】:
我的老师让我们使用以下预处理器宏来实现 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)))
【问题讨论】:
-
显然他/她从来没有学会习惯将宏大写,如果你把它看成一个函数,并且将像 i++ 这样的参数传递给宏,就会发生不好的事情
-
很高兴知道!我们说的是全部大写吗?
-
是的,宏名通常写成
ALL_CAPS。
标签: c struct linked-list c-preprocessor