マクロを使用してデータ構造操作を定義するという概念に頭を悩ませようとしています。次のコードは、FreeBSD に組み込まれているリスト ライブラリを使用する簡単な例です。ライブラリでは、すべての操作がマクロとして定義されています。他のいくつかのライブラリでもこのアプローチを見てきました。
これにはいくつかの利点があることがわかります。リスト内の要素として任意のデータ構造を使用できること。しかし、これがどのように機能するのかよくわかりません。例えば:
- とは
stailhead
? これは「ただ」定義されているようです。 head
どのようにentries
関数に渡しますか?- 型は何ですか
head
、それへのポインタを宣言するにはどうすればよいですか?
Google を検索するために使用できるこの手法の標準的な名前、またはこの概念を説明している本はありますか? この手法がどのように機能するかについてのリンクまたは適切な説明は、非常に高く評価されます。
Niklas Bに感謝します。実行gcc -E
して、この定義を取得しましたhead
struct stailhead {
struct stailq_entry *stqh_first;
struct stailq_entry **stqh_last;
} head = { ((void *)0), &(head).stqh_first };
そしてこれはstailq_entry
struct stailq_entry {
int value;
struct { struct stailq_entry *stqe_next; } entries;
};
だから私head
はタイプだと思いstruct stailhead
ます。
#include <stdio.h>
#include <stdlib.h>
#include <sys/queue.h>
struct stailq_entry {
int value;
STAILQ_ENTRY(stailq_entry) entries;
};
int main(void)
{
STAILQ_HEAD(stailhead, stailq_entry) head = STAILQ_HEAD_INITIALIZER(head);
struct stailq_entry *n1;
unsigned i;
STAILQ_INIT(&head); /* Initialize the queue. */
for (i=0;i<10;i++){
n1 = malloc(sizeof(struct stailq_entry)); /* Insert at the head. */
n1->value = i;
STAILQ_INSERT_HEAD(&head, n1, entries);
}
n1 = NULL;
while (!STAILQ_EMPTY(&head)) {
n1 = STAILQ_LAST(&head, stailq_entry, entries);
STAILQ_REMOVE(&head, n1, stailq_entry, entries);
printf ("n2: %d\n", n1->value);
free(n1);
}
return (0);
}