私の先生は、Cでリンクされたキューを実装する際に次のプリプロセッサマクロを使用するように指示しています。アイデアは、キューにデータを保持させないことでキューを汎用化し、キュー内のノードとそれに属するデータを保持するラッパー構造体を他の場所に配置することです。
以下のマクロは、キューからノード(つまり、ノード)、ラッパー構造体のタイプ(つまり、struct Wrapper)、およびラッパーのキューノード要素の名前(つまり、qnode(Wrapperにはqnodeという要素があります))を取り込みます。
次に、マクロは、渡されたノードが含まれている構造体ラッパーを返します。
したがって、呼び出しは次のようになります。
queue_entry(node, struct Wrapper, qnode)
これは私の目には非常にクールで、うまく機能します(私の先生がどのように書いたかを見ると、もっと良いでしょう!)。しかし、私は誰かがそれが実際にどのように機能するかを私に説明できることを望んでいましたか?舞台裏で実際に何が起こっているのか途方に暮れているからです。
マクロ:
#define queue_entry(NODE, STRUCT, MEMBER) \
((STRUCT *)((uint8_t*)(NODE) - offsetof(STRUCT, MEMBER)))