[英]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];
在這種情況下,有兩種選擇:第一種是同時省略typedef
和struct_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.