簡體   English   中英

C結構類型定義中的無用變量名

[英]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的結構,該結構存儲了對自身的兩個引用( nextprev )和一個intid

typedef用於創建類型別名

typedef struct snode node;

讀起來像struct snode命名為node的類型別名

是的,你是對的。 除了typedef之外,顯式命名結構也只是習慣或約定的問題。

注意,這兩種方法幾乎沒有成本,因為llist不是變量,也不占用內存。 就像命名變量iindex之間的區別一樣-編譯的形式是相同的,但是一個可能比另一個更易讀。

這種情況下,它是沒有用的但是,如果您想結構本身中指向該結構的指針,則將需要它。

這是因為該結構在開頭大括號處是已知的,而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.

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