typedef 语句的不同命名方式的目的是什么?

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. 您想实现结构的前向声明以便在 f.e 中使用它。函数定义或其他结构 结构定义出现之前(如果您有多个翻译 units/C 文件则很重要)。

例如:

File1.c

struct name;   // forward declaration of structure `name`.

void foo(struct name *ptr)
{
    ....
}

struct bar
{
   int x;
   struct name y;
}

File2.c

typedef struct name
{
    int a;
    double b;
    char c;
}name_t;
  1. 您想在结构内部定义一个指向结构本身的对象的指针,就像链表所要求的那样:
typedef struct name
{
    int a;
    double b;
    char c;
    struct name *next;    
}name_t;