5

マクロを使用してデータ構造操作を定義するという概念に頭を悩ませようとしています。次のコードは、FreeBSD に組み込まれているリスト ライブラリを使用する簡単な例です。ライブラリでは、すべての操作がマクロとして定義されています。他のいくつかのライブラリでもこのアプローチを見てきました。

これにはいくつかの利点があることがわかります。リスト内の要素として任意のデータ構造を使用できること。しかし、これがどのように機能するのかよくわかりません。例えば:

  1. とはstailhead? これは「ただ」定義されているようです。
  2. headどのようにentries関数に渡しますか?
  3. 型は何ですか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);
}
4

1 に答える 1

7

最初にこれを読んで、これらのマクロが何をするかを把握してください。そして、に移動しqueue.hます。あなたはそこにあなたの宝の山を手に入れるでしょう!

私はあなたのためにいくつかの金貨を見つけました-

#define STAILQ_HEAD(name, type)                                         \
struct name {                                                           \
        struct type *stqh_first;/* first element */                     \
        struct type **stqh_last;/* addr of last next element */         \
}

少し深く掘り下げて、質問に答えましょう

ステールヘッドとは何ですか?これは「ちょうど」定義されているようです。

#define STAILQ_HEAD(name, type)                                         \
struct name {                                                           \
        struct type *stqh_first;/* first element */                     \
        struct type **stqh_last;/* addr of last next element */         \
}
 STAILQ_HEAD(stailhead, entry) head =
 STAILQ_HEAD_INITIALIZER(head);
 struct stailhead *headp;            /* Singly-linked tail queue head. */

stailhead構造もそうです

ヘッドとエントリを関数に渡す方法は?

#define STAILQ_ENTRY(type)                                              \
struct {                                                                \
        struct type *stqe_next; /* next element */                      \
}

したがってentrieshead(前に説明したように)は単なる構造体であり、他の構造体を渡すのと同じようにそれらを渡すことができます。&structure_variable

ヘッドとはどのタイプですか、それへのポインタをどのように宣言できますか?

すでに説明しました!

素敵な例については、このマニュアルページをお読みください。

于 2012-04-05T15:43:47.143 に答える