[英]Usage of Typedef Struct in C programming
我有一個C模板作為作業。 但是在做作業之前,我需要清楚地理解“ typedef”和“ struct”的用法,以便繼續進行編碼。 這是代碼;
typedef struct NODE_s *NODE;
typedef struct NODE_s
{
NODE right;
NODE left;
unsigned long data;
int height;
} NODE_t[1];
typedef struct TREE_s *TREE;
typedef struct TREE_s
{
NODE root;
} TREE_t[1];
TREE tree_init();
NODE node_init(unsigned long data);
首先,行typedef struct NODE_s *NODE;
是什么typedef struct NODE_s *NODE;
在這里嗎? 為什么將它命名為帶有*
的指針?
然后,在struct定義之后,創建名為NODE_t[1]
的變量的目的是什么,將帶有數字“ 1”的方括號與數組連接起來,還是僅此而已?
最后,當tree_init();
和node_init(unsigned long data);
聲明函數,為什么使用TREE和NODE數據類型名稱與在結構定義之前將它們聲明為*TREE
和*NODE
相反? 謝謝你的回答。
給您的模板是這個,在其中我為一些行添加了數字以方便參考:
typedef struct NODE_s *NODE; // 1
typedef struct NODE_s // 2
{
NODE right; // 3
NODE left;
unsigned long data;
int height;
} NODE_t[1]; // 4
typedef struct TREE_s *TREE;
typedef struct TREE_s
{
NODE root;
} TREE_t[1];
TREE tree_init(); // 5
NODE node_init(unsigned long data);
這里有什么問題?
NODE_s
的結構類型;(2)名稱NODE
是struct NODE_s *
的同義詞。該結構類型目前struct NODE_s *
完整;尚無詳細信息它的成員。 typedef
,但也開始定義類型struct NODE_s
(由於下一行的{
)。 NODE
類型是已知的。 它可以在這里使用。 它的含義與您編寫struct NODE_s *right;
。 NODE_t
是類型struct NODE_s[1]
的別名,它是1個struct NODE_s
的數組。 目前尚不清楚這將用於什么用途。 我對它的存在(至多)持保留態度。 (您也可以將第1、2、4點中的討論應用於必要的細節struct TREE_s
類型。) tree_init()
函數,因為未指定有關這些參數的數量或類型的信息。 我們知道這是不是一個可變參數函數(變量參數列表,像printf()
),因為這些必須有一個完整的原型聲明結尾, ...)
正在使用之前的范圍。 如果要指定該函數不接受任何參數,請這樣說: TREE tree_init(void);
。 我認為NODE_t
和TREE_t
類型背后的意圖是允許您編寫代碼,例如:
int main(void)
{
TREE_t x = { 0 };
if (x->root != 0)
return 1;
return 0;
}
與使用struct NODE_s x
和在測試中使用x.root
相比,我不確定這是否足以保證類型。 它確實使您不必在傳遞指向函數的指針時添加&
; 同樣,我不確定是否真的有足夠的力量保證它的存在。
我希望看到的模板是:
typedef struct NODE_s NODE;
struct NODE_s
{
NODE *right;
NODE *left;
unsigned long data;
int height;
};
typedef struct TREE_s TREE;
struct TREE_s
{
NODE *root;
};
extern TREE *tree_init(void);
extern NODE *node_init(unsigned long data);
這從typedef
語句中刪除了指針,避免了一些奇怪的數組類型,並為tree_init()
使用了一個顯式原型。 我個人更喜歡將函數聲明標記為extern
; 在標頭中,它們將與標頭中聲明的那些罕見的全局變量上的extern
匹配。 許多人寧願不使用extern
因為編譯器還是會假設這樣做-就是這樣; 最重要的是一致性。
現在將編寫main()
的代碼:
int main(void)
{
TREE x = { 0 };
if (x.root != 0)
return 1;
return 0;
}
區別? 箭頭->
變為點.
。 那里沒有很多問題。 但是,在調用函數時,您可能會使用&x
而對於TREE_t
類型,您只會寫x
(因為它是一個數組)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.