0

私はCでリンクリストを実装しています。これが私が作成した構造体で、リンクリストを表しています。

typedef struct llist {
  struct lnode* head; /* Head pointer either points to a node with data or NULL */
  struct lnode* tail; /* Tail pointer either points to a node with data or NULL */
  unsigned int size; /* Size of the linked list */
} list;

「リスト」は基本的に役に立たないのではありません。クライアントがこのライブラリを使用して新しいリンクリストを作成すると、次の宣言が行われます。

list myList;

したがって、最初の中括弧の直前にllistと入力しても、実際には役に立たないでしょう。次のコードは基本的に同じ仕事をします:

typedef struct {
  struct lnode* head; /* Head pointer either points to a node with data or NULL */
  struct lnode* tail; /* Tail pointer either points to a node with data or NULL */
  unsigned int size; /* Size of the linked list */
} list;
4

4 に答える 4

2

宣言で構造体を参照する場合は、構造体に名前を付ける必要があります。

typedef struct snode {
    struct snode* next;
    struct snode* prev;
    int id;
} node;

ただし、その内部で構造体を参照しない場合は、名前を付ける必要はありません。


編集

typedefC ではis とstructare という 2 つの異なるステートメントがあることに注意してください。

struct複雑なタイプを作成するためのものです:

struct snode {
    struct snode* next;
    struct snode* prev;
    int id;
};

これは、それ自体 ( and ) と( )への 2 つの参照を格納するという構造体を作成するsnodenextprevintidように読みます。

そしてtypedef、型エイリアスを作成するためのものです:

typedef struct snode node;

これは、 calledの型エイリアスを作成するstruct snodenodeようなものです。

于 2012-12-06T23:06:31.013 に答える
1

その特定のケースは役に立ちませんが、構造体自体の中でその構造体へのポインターが必要な場合は、それが必要になります。

これは、最後のセミコロンまで typedef がわからないのに対し、構造体は左中かっこでわかっているためです (単純化されていますが、ここでは十分です)。

したがって、次のような場合に必要になります。

typedef struct sNode {  // structure can be used now
    int payload;
    struct sNode *next; // cannot use typedef yet
} tNode;                // typedef can be used now
于 2012-12-06T23:01:33.973 に答える
1

はい。それで合っています。typedef に加えて構造体に明示的に名前を付けるのは、習慣または慣習の問題です。

llistは変数ではなく、メモリを占有しないため、どちらの方法でもほとんどまたはまったくコストがかからないことに注意してください。これは、変数の命名の違いと似ています。iまたはindex、コンパイルされた形式は同じですが、一方が他方より読みやすい場合があります。

于 2012-12-06T22:59:11.933 に答える
0

これを好転させることができます: 構造タグではなく、typedef 全体が不要です。

struct snode {
    struct snode* next;
    struct snode* prev;
    int id;
    };

これで、次のようにポインターを宣言できます。

struct snode *ptr;

それらの配列を宣言することもできます:

struct snode mynodes[10];

struct キーワードを入力する必要がありますが、コンパイラや人間の読者を傷つけることはありません (構文の強調表示を見てください!)。

不完全な型を使用して、(コンパイルのこの時点で) 不明な型へのポインターを宣言することもできます。

struct xnode *xptr=NULL;

これは、ライブラリの実際の実装が呼び出し元に知られていないライブラリへの API を作成する場合に便利です。

 struct gizmo *open_gizmo(char *path, int flags);
 int fiddle_with_gizmo(struct gizmo *ptr, int opcode, ...);

など。typedef を使用すると、ヘッダー ファイルは、その必要がない場合でも、すべての内部情報を呼び出し元に「ブロードキャスト」するように強制されます。

于 2012-12-06T23:35:25.917 に答える