一、struct基础用法:你肯定用错了!
(先别急着反驳,看完这段再说)很多人在学C语言的时候,上来就这么写:
struct Student {
char name[20];
int age;
};
然后使用时:
struct Student stu1; // 正确但很啰嗦的写法
这么写虽然没错,但相当于每次声明变量都要带着struct关键字。想象一下,如果你要定义struct struct_name variable_name这样的结构体数组、指针…(是不是已经开始手抖了?)
重点来了!!!
在C语言标准里,struct的完整类型名是struct TagName,而不是直接使用TagName。这就是为什么每次都要写struct关键字的原因(C++里可以直接用TagName,但我们现在说的是纯C!)
二、typedef拯救世界的正确姿势
(这里有个99%新手都会踩的坑)来看看这个经典写法:
typedef struct {
int x;
int y;
} Point; // 注意这里没有结构体标签
这时候你直接Point p1;完全没问题,但代价是——这个结构体没法自引用了!(比如链表节点结构体里的next指针)
正确示范(敲黑板!)
typedef struct Node {
int data;
struct Node* next; // 这里必须用struct Node
} Node; // 这里的别名可以和标签同名
这样既可以用Node n1;声明变量,又能实现结构体自引用。划重点:typedef只是给现有类型起别名,不会创建新类型
三、血泪教训:那些年我们写崩的代码
场景1:头文件重复包含
假设你在头文件里写:
typedef struct {
int a;
} MyStruct;
当这个头文件被多个源文件包含时,虽然编译器不会报错,但每个源文件里的MyStruct其实是不同的类型!(后果:内存对齐不一致时直接程序崩溃)
场景2:前向声明灾难
在头文件想提前声明结构体时:
typedef struct MyStruct MyStruct; // 前向声明
void process(MyStruct* ptr); // 这里用别名没问题
struct MyStruct {
int value;
};
如果没写前向声明直接使用MyStruct*,编译器会直接懵逼(error: unknown type name)
四、嵌入式开发中的实战技巧
(来自真实项目翻车案例)在STM32 HAL库中,经常看到这样的写法:
typedef struct __FILE FILE;
这种骚操作是为了在不完全公开结构体定义的情况下,允许用户使用FILE*类型指针。这样做的好处:
- 隐藏结构体细节
- 防止用户直接操作结构体成员
- 保持二进制兼容性
特殊场景:匿名结构体
在寄存器映射时特别好用:
typedef struct {
__IO uint32_t CR; // 控制寄存器
__IO uint32_t SR; // 状态寄存器
} SPI_TypeDef;
#define SPI1 ((SPI_TypeDef *)0x40013000)
这样访问寄存器就像用SPI1->CR = 0x01;,既安全又直观。注意:必须使用typedef才能这样操作
五、面试官最爱问的死亡问题
问题1:
typedef struct _X{
int a;
} X;
struct _X x1; // 这个合法吗?
X x2; // 这个合法吗?
答案:都合法!但建议保持命名统一,要么都用typedef别名,要么都用struct标签
问题2:
typedef struct {
int val;
} A, *pA;
pA ptr1; // 这是什么类型?
struct A a1; // 这个写法对吗?
陷阱解析:
pA是A*的类型别名- 结构体没有标签名,所以
struct A的写法是错误的!
六、终极选择指南(保命必备)
什么时候用typedef:
- 需要简化复杂类型(如函数指针)
- 实现数据封装
- 需要跨平台兼容性
什么时候不用typedef:
- 需要前向声明时
- 结构体需要自引用
- 需要明确类型结构时
(超级重要)黄金法则:
- 在头文件中始终使用
typedef struct Tag Tag;的格式 - 结构体标签用大写驼峰,typedef别名用全小写
- 在.c文件中定义结构体细节,.h文件中只放声明
七、新型写法:C11标准的新姿势
(装逼必备)C11允许这样的骚操作:
typedef struct Person {
char name[20];
} Person, *PersonPtr, People[10];
此时:
Person p1是结构体变量PersonPtr是结构体指针People是包含10个Person结构的数组类型
但慎用!这样的写法虽然炫酷,但会大幅降低代码可读性(团队开发时可能被同事打死)
最后说句大实话:
虽然typedef struct能简化代码,但过度使用会让代码像一锅八宝粥。记住——代码是写给人看的,其次才是给机器执行的。下次写结构体时,先想想三个月后的自己还能看懂这代码吗?
&spm=1001.2101.3001.5002&articleId=147643567&d=1&t=3&u=49c94fc74aa34f2e8dd723c0af0fc92a)
1万+

被折叠的 条评论
为什么被折叠?



