为什么需要使用 `typedef` 为结构体定义别名?直接使用 `struct tag_name` 不够吗?

0 阅读2分钟

接手C / C++ 项目的话, 在数据类型定义的地方很容易看到大片的 typedef struct tag_name { ... } Name, 说实话这很让人很困惑 emmmmmmmmmm

Gavin Thomas - emm mm.gif

Q WHY ? ? ?

image.png

为什么需要使用 typedef 为结构体定义别名?直接使用 struct tag_name 不够吗?

使用 typedef定义结构体时,为何有时需要加struct 关键字,有时又不需要?

抽根YAN缓一缓.gif

A C语言的结构体标签和类型名是两个不同的概念

C语言的结构体标签和类型名是两个不同的概念。标签名仅用于标识结构体的定义,而类型名则通过typedef引入,使得可以直接使用类型名声明变量。

C语言的设计初衷是为了提供灵活性和清晰性。通过将标签名和类型名区分开来,开发者可以更明确地控制结构体的定义和使用场景。

定义方式是否需要struct关键字示例
匿名结构体+typedef不需要typedef struct { int x; } Point;
带标签结构体+typedef需要struct Tag { int x; }; typedef struct Tag Point;

因此, 在C语言中,使用typedef为结构体定义别名时,是否加struct关键字取决于语法上下文。

image.png

如果直接用typedef struct { ... } Name形式,此时已为结构体创建了类型别名,无需再用struct前缀。例如:typedef struct { int x; } Point;,可以直接声明Point p;

然而,若仅定义结构体标签而未立即使用typedef,如struct Tag { int x; }; typedef struct Tag Point;,则后续声明变量仍需写成struct Tag t;或通过别名Point p;

这是因为C语言区分结构体标签和类型名,typedef的作用是创建类型别名,简化复杂类型的书写。

总结来说,是否加struct取决于结构体定义方式及类型别名的存在与否。


然而 在C++ 中, 结构体标签可直接作为类型名, 无需 struct 关键字

C 和 C++ 对 “结构体标签” 的处理规则不同,这是两种定义方式差异的根源 —— C 语言中,结构体必须通过 struct 标签 或 typedef 别名 引用;C++ 中,结构体标签可直接作为类型名,无需 struct 关键字。 C 语言对结构体的约束更严格,标签的存在与否直接决定了结构体的灵活性。

所以, 这或许是前辈 继承了C语言的语法书写习惯. 让这种语法在C++中看起来很冗余

此致 敬礼.gif