簡體   English   中英

Typedef結構語法

[英]A typedef struct syntax

typedef struct {
int Key_value;
Node *link;
}Node;

以上聲明有效嗎? 還是我應該使用

typedef struct _node{
int Key_value;
_node *link;
}Node;

不,它是無效的(如果您嘗試對其進行編譯,您會注意到)。

直到typedef之后才引入typedef別名,因此您不能在其內部使用它。

第二個也是無效的(在C中), _node也不是有效的類型名稱。 您必須使用struct _node作為自引用。

我傾向於使用預聲明並將其拆分:

typedef struct Node Node;

struct Node {
  int Key_Value;
  Node *link;
};

關鍵是您實際上可以為結構和typedef賦予相同的名稱:

typedef struct Node {
    int Key_value;
    struct Node *link;
} Node;

在這里,我添加了一些內容,這些內容將導致您的代碼無法在C編譯器中編譯:在定義結構之后才創建typedef 這意味着我們必須在link成員聲明中使用結構名稱。

這可以通過給結構命名(如上)或首先聲明typedef來解決:

typedef struct Node *Node;

struct Node {
    int Key_value;
    Node *link;
};

還要注意,在C ++中,在聲明link成員時不需要使用typedef關鍵字或struct關鍵字:

// C++ version
struct Node {
    int Key_value;
    Node *link;
};

結構(和類)名稱可以用作C ++中的類型。

第一個聲明無效,因為在將link聲明為結構成員時不知道Node 原因是聲明名稱僅在聲明器之后可見(簡單地說,即在逗號,等號或分號之后)。 因此, typedef就像其他聲明一樣,名稱Node僅在結束聲明語句的最后一個分號后才可見。

因此,您必須使用第二種形式(第一種形式甚至不會編譯)。 但是,如果您使用的是C語言,請注意,應在_node struct關鍵字,如下所示:

typedef struct _node {
    int Key_value;
    struct _node *link;
} Node;

如果您使用的是C ++,則沒有必要。

兩者均無效。 對於C和C ++,這是一種有效的方法:

struct Node
{
    int Key_value;
    struct Node *link;
};


// if C, you can also do this
typedef struct Node Node;

要點是,無論Link的類型是什么,它都必須是已經聲明的 struct X { ....聲明struct X是一個類型(但尚未定義它,但是可以)。

在C中,您應該執行以下操作:

typedef struct _node {
    int Key_value;
    struct _node *link;
} Node;

但是,如果您使用的是C ++,則根本不需輸入typedef

struct Node {
    int Key_Value;
    Node* link;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM