[英]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_t
是typedef
創建的新類型。
在以下情況下,顯式提供結構標記很有用:
例如:
文件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;
typedef struct name
{
int a;
double b;
char c;
struct name *next;
}name_t;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.