簡體   English   中英

在typedef結構中指定結構名稱

[英]Specify struct name in typedef struct

之間有什么區別?

typedef struct{

    uint8   index;
    uint8   data[256];

}list_t;

list_t myList;

typedef struct list_t{

    uint8   index;
    uint8   data[256];

}list_t;

list_t myList;

我正在使用第一種方法,但是在答案上看到了第二種方法。 我只想定義類型並用該類型分別定義變量。

差異對於自引用數據結構很有用。

typedef struct
{
  int value;
  Example1 *ptr; // error here: the type Example1 is not known yet
} Example1;

typedef struct Example2
{
  int value;
  struct Example2 *ptr; // OK: the type struct Example2 is known
} Example2;

請注意, struct之后的名稱不一定與用於typedef的名稱相同。

這似乎與口味和首選的編碼樣式有關,但是第二種方式(如其他答案所述)對於自引用結構(例如列表或樹數據結構)和前向聲明很有用。 對於我而言,我更喜歡C語言中的第二種方法,並認為它更為常見。

參考

在C中:

[typedef] struct [struct_name]
{
    type attribute;
    type attribute2;
    // ...
    [struct struct_name *struct_instance;]
} [struct_name_t] [struct_instance];

在這種情況下,有兩種選擇:第一種是同時省略typedefstruct_name_t ,在這種情況下,要聲明一個結構,您實際上需要包括struct關鍵字:

struct struct_name struct_instance;

或者,您可以使用typedef聲明可以使用的struct_name_t類型:

struct_name_t struct_instance;

在任何一種情況下,如果您想聲明一個指向該結構內部結構的指針,則必須使用第一種語法,並帶有關鍵字struct:

struct struct_name *struct_instance;

第二種方法允許您向前聲明結構類型。 因此,如果我們處理標頭,則可以避免不必要的傳遞包含。 例如,考慮以下小標題:

// No need to include the header with the full struct definition
// A forward declaration will do
struct list_t;
void foo(struct list_t *);
void bar(void); // Doesn't use list_t

這消除了所有客戶端代碼對list_t完整定義的依賴。 只需要使用bar代碼不會被強制包含list_t的定義(通過傳遞包含)。

使用第一種方法時,將為沒有標簽的結構類型創建別名,因此無法轉發聲明它。 並且客戶端代碼被強制包括您的類型定義以訪問其名稱。

暫無
暫無

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

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