[英]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.