簡體   English   中英

Typedef Struct在C編程中的使用

[英]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); 聲明函數,為什么使用TREENODE數據類型名稱與在結構定義之前將它們聲明為*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);

這里有什么問題?

  1. 如評論中所述,SO Q&A typedef指針是否是一個好主意,暗示typedef指針不是一個好主意,“函數指針”的例外情況有限(此處不相關),也許(但可能不是)不透明的類型。 該行有兩件事:(1)說“存在帶有標記NODE_s的結構類型;(2)名稱NODEstruct NODE_s *的同義詞。該結構類型目前struct NODE_s *完整;尚無詳細信息它的成員。
  2. 該行開始一個新的typedef ,但也開始定義類型struct NODE_s (由於下一行的{ )。
  3. NODE類型是已知的。 它可以在這里使用。 它的含義與您編寫struct NODE_s *right;
  4. 名稱NODE_t是類型struct NODE_s[1]的別名,它是1個struct NODE_s的數組。 目前尚不清楚這將用於什么用途。 我對它的存在(至多)持保留態度。 (您也可以將第1、2、4點中的討論應用於必要的細節struct TREE_s類型。)
  5. 這是一個函數聲明,但不是原型聲明。 它說可以使用任何數量的任何類型的參數來調用tree_init()函數,因為未指定有關這些參數的數量或類型的信息。 我們知道這是不是一個可變參數函數(變量參數列表,像printf() ),因為這些必須有一個完整的原型聲明結尾, ...)正在使用之前的范圍。 如果要指定該函數不接受任何參數,請這樣說: TREE tree_init(void);

我認為NODE_tTREE_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.

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