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
创建的新类型。
明确提供结构标签很有用,如果:
- 您想实现结构的前向声明以便在 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;
- 您想在结构内部定义一个指向结构本身的对象的指针,就像链表所要求的那样:
typedef struct name
{
int a;
double b;
char c;
struct name *next;
}name_t;
我有关于 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
创建的新类型。
明确提供结构标签很有用,如果:
- 您想实现结构的前向声明以便在 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;
- 您想在结构内部定义一个指向结构本身的对象的指针,就像链表所要求的那样:
typedef struct name
{
int a;
double b;
char c;
struct name *next;
}name_t;