繁体   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