[英]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.