簡體   English   中英

typedef 語句的不同命名方式的目的是什么?

[英]What is purpose for different ways of naming of typedef statement?

我有關於typedef語句的問題。

是我總是如何編寫此語句的代碼:

typedef struct name
{

}name_t;

這是我如何寫的另一個例子:

typedef struct
{

}name;

問題是:這些方式的目的是什么?

如果必須在typedef完成之前引用類型,則需要使用第一種格式。 如果結構包含指向相同類型的指針,這是必要的。 這在定義鏈表時出現。

typedef struct name
{
    int value;
    struct name *next;
}name_t

你不能使用name_t *next; 在結構聲明中,因為name_t直到稍后才定義。

typedef struct name
{

}name_t;

這里的name是一個結構標記,對於普通用例來說是多余的,因為無論如何你最終都會得到一個typedef並且應該只在你的代碼中使用name_t從那里開始。

您添加標簽的唯一原因是在特殊情況下您需要一個自引用結構,例如struct name* next; 鏈接列表等中的成員。 在這種情況下,我們必須使用 struct 標記,因為在 typedef 語句本身完成之前不能使用 typedef 名稱。 另一種選擇是轉發聲明結構。

_t命名是自誕生以來命名類型的行業標准方式。 不幸的是,POSIX 標准有一個錯誤的想法,不允許這樣的命名,所以如果你關心 POSIX 合規性,你不應該在最后用_t命名你的類型。 如果您不關心 POSIX,則應該使用_t ,因為它提供了正確的、自記錄的代碼。

typedef struct name
{
    int a;
    double b;
    char c;
}name_t;

name是結構標記,而name_ttypedef創建的新類型。

在以下情況下,顯式提供結構標記很有用:

  1. 您想在結構定義發生之前實現結構的前向聲明,以便在 fe function 定義或其他結構中使用它(如果您有多個翻譯單元/C 文件,這很重要)。

例如:

文件1.c

struct name;   // forward declaration of structure `name`.

void foo(struct name *ptr)
{
    ....
}

struct bar
{
   int x;
   struct name y;
}

文件2.c

typedef struct name
{
    int a;
    double b;
    char c;
}name_t;
  1. 您想在結構內部定義指向結構本身的 object 的指針,就像鏈表所要求的那樣:
typedef struct name
{
    int a;
    double b;
    char c;
    struct name *next;    
}name_t;

暫無
暫無

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

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