-2

現在、私はこれを使用していstructます。

typedef struct node {
    struct node *prev;
    struct node *next;
    size_t elem_size;
    void *data;
} dll_node;

asに名前を付けずにstruct prevとへの 2 つのポインターを使用したいのですが、内でtypedef を使用します。どうやってやるの?nextstructnodedll_nodestruct

使ってみた

dll_node *next;

現在のものではなく、不明なタイプ名: 'dll_node' というエラーが表示されます。

4

5 に答える 5

3

あなたがしていることをすることは不可能です。dll_nodeコンパイラーは、割り当て時に構造体が必要とするバイト数を決定するため、何が何であるかわかりません。これを行う:

struct node;

typedef struct node dll_node;

struct node {
  dll_node *next;
  dll_node *prev;
  size_t elem_size;
  void *data;
};

... または私が個人的に使用したい方法 (構造体へのポインターを扱うことが多いため):

struct node;

typedef struct node *dll_node;

struct node {
  dll_node next;
  dll_node prev;
  size_t elem_size;
  void *data;
};
于 2013-08-11T14:46:40.347 に答える
2

複数の識別子を使用して同じ型を参照することを避けるための解決策は、次のイディオムです。

typedef struct dll_node dll_node;

struct dll_node {
  dll_node* prev;
  ...
};

typedefは、 の前方宣言と同時に機能することに注意してくださいstruct

structまた、これは名前空間で 1 つの型名を定義し、識別子の名前空間で1 つの型名を定義していることにも注意してください。ただし、これは C で取得できる最高のものです。

于 2013-08-11T15:31:16.357 に答える
0

私があなたの主張を理解しているかどうかはよくわかりませんが、あなたができることは、ポリモーフィックstructの短い部分を実装することだと思います。あなたの場合node、タグとdllnodeタイプです。タグは、構造体自体内の構造体を参照するために必要です。そのため、最後のステートメントが失敗し、struct node正当であるだけです。静的な設計で動的な動作を行うことはできません。私があなたなら、デザインを次のように変更します。

struct dllnode{
    node super;
    dllnode *next;
    dllnode *prev;
    size_t  elem_size;
    void    *payload;
    uint32_t flag;
};

struct node{
   node   *next;
   node   *prev;
   size_t elem_size;
   void   *payload;
};

したがって、nodeコード内にプリミティブ型と複数の「子」型dllnodeまたは必要なその他のノード型を含めることができます。父親 (ノード) を子供 (dllnode) としてキャストすることにより、2 つの構造体間で値を交換できます。これは、C 標準では、構造体の最初のメンバーは構造体の先頭に配置されると規定されているためです。例えば:

void add_dllnode(struct node *s)
{
    struct dllnode *self = (struct dllnode *) s;
    self->next = s->next;
    self->prev = s->prev;
    self->elem_size = s->elem_size;
    self->payload = s->payload;
    // you can now do treat node as if it's dllnode and probably add it to
    // one of your lists
}

さらに、フラグメンバーを作成するたびにnode、フラグメンバーを次のように調整しNODE_TYPE_DLLたりNODE_TYPE_OTHER、呼び出しの条件として使用したりできます。

struct node s;
init_node(s);
...
if(((s->flag) & NODE_TYPE_DLL))
    add_dllnode(s);
else
    ...

...
于 2013-08-11T18:04:26.287 に答える