[英]Useless variable name in C struct type definition
我正在C中實現一個鏈表。這是我制作的一個結構,它代表鏈表:
typedef struct llist {
struct lnode* head; /* Head pointer either points to a node with data or NULL */
struct lnode* tail; /* Tail pointer either points to a node with data or NULL */
unsigned int size; /* Size of the linked list */
} list;
“全部”不是基本上沒有用的。 當客戶使用此庫並創建新的鏈表時,他將具有以下聲明:
list myList;
因此,在大括號之前輸入llist實際上是沒有用的,對吧? 以下代碼基本上可以完成相同的工作:
typedef struct {
struct lnode* head; /* Head pointer either points to a node with data or NULL */
struct lnode* tail; /* Tail pointer either points to a node with data or NULL */
unsigned int size; /* Size of the linked list */
} list;
如果要在結構的聲明中引用該結構,則需要給它命名。
typedef struct snode {
struct snode* next;
struct snode* prev;
int id;
} node;
但是,如果您不引用其內部的結構,則無需為其命名。
編輯
請注意, typedef
is和struct
是C中的兩個不同語句。
struct
用於創建復雜類型:
struct snode {
struct snode* next;
struct snode* prev;
int id;
};
讀起來像是一個名為snode
的結構,該結構存儲了對自身的兩個引用( next
和prev
)和一個int
( id
) 。
typedef
用於創建類型別名 :
typedef struct snode node;
讀起來像為struct snode
命名為node
的類型別名 。
是的,你是對的。 除了typedef之外,顯式命名結構也只是習慣或約定的問題。
注意,這兩種方法幾乎沒有成本,因為llist
不是變量,也不占用內存。 就像命名變量i
或index
之間的區別一樣-編譯的形式是相同的,但是一個可能比另一個更易讀。
在這種情況下,它是沒有用的,但是,如果您想在結構本身中指向該結構的指針,則將需要它。
這是因為該結構在開頭大括號處是已知的,而typedef直到最后一個分號才知道(簡單化,但在這里足夠好了)。
因此,您將需要使用它,例如:
typedef struct sNode { // structure can be used now
int payload;
struct sNode *next; // cannot use typedef yet
} tNode; // typedef can be used now
您可以解決這個問題:不是結構標簽,而是整個typedef是多余的。
struct snode {
struct snode* next;
struct snode* prev;
int id;
};
現在,您可以使用以下方法聲明一個指針:
struct snode *ptr;
您甚至可以聲明它們的數組:
struct snode mynodes[10];
您必須輸入struct關鍵字,但這不會損害編譯器或普通讀者(請看語法高亮!)。
您甚至可以使用不完整的類型聲明一個指向未知類型的指針(在編譯此刻):
struct xnode *xptr=NULL;
當您想為某個庫創建API時,這將派上用場,而調用者不知道該庫的實際實現:
struct gizmo *open_gizmo(char *path, int flags);
int fiddle_with_gizmo(struct gizmo *ptr, int opcode, ...);
等等。 即使沒有必要,typedef也會強制頭文件將其所有內部信息“廣播”給調用方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.