接手C / C++ 项目的话, 在数据类型定义的地方很容易看到大片的 typedef struct tag_name { ... } Name, 说实话这很让人很困惑 emmmmmmmmmm
Q WHY ? ? ?
为什么需要使用 typedef 为结构体定义别名?直接使用 struct tag_name 不够吗?
使用 typedef定义结构体时,为何有时需要加struct 关键字,有时又不需要?
A C语言的结构体标签和类型名是两个不同的概念
C语言的结构体标签和类型名是两个不同的概念。标签名仅用于标识结构体的定义,而类型名则通过typedef引入,使得可以直接使用类型名声明变量。
C语言的设计初衷是为了提供灵活性和清晰性。通过将标签名和类型名区分开来,开发者可以更明确地控制结构体的定义和使用场景。
| 定义方式 | 是否需要struct关键字 | 示例 |
|---|---|---|
| 匿名结构体+typedef | 不需要 | typedef struct { int x; } Point; |
| 带标签结构体+typedef | 需要 | struct Tag { int x; }; typedef struct Tag Point; |
因此, 在C语言中,使用typedef为结构体定义别名时,是否加struct关键字取决于语法上下文。
如果直接用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++中看起来很冗余