文章目录
当结构体遇上typedef(前方高能预警!)
刚学C语言那会儿,老张在课堂上敲着黑板说:“结构体是嵌入式开发的灵魂!” 我信了(然后就被坑了整整一周)。直到某次笔试看到这题:
struct Student {
int age;
};
typedef struct Teacher {
int salary;
} Teacher;
这两个定义方式到底有啥不同?(考官你出来!这玩意儿实际开发真用得上?)今天我们就来扒一扒这个让无数萌新怀疑人生的语法差异!
基础语法大拆解(手把手保姆级教程)
纯struct选手登场
struct Point {
int x;
int y;
};
使用时必须带着struct
关键字:
struct Point p1; // 每次都要打六个字母!
struct Point* ptr = &p1; // 指针声明更崩溃
typedef struct 豪华套餐
typedef struct {
int width;
int height;
} Rect; // 注意这个位置!
现在声明时:
Rect r1; // 直接当基本类型用
Rect* arr[10]; // 指针数组so easy
隐藏的雷区(血的教训!!)
雷区一:自引用结构
想实现链表节点?试试这个:
typedef struct Node {
int data;
struct Node* next; // 必须用struct!
} Node;
如果写成Node* next
直接编译报错!(别问我怎么知道的)
雷区二:头文件重复包含
某次我把这个写进头文件:
typedef struct {
char* name;
} Employee;
结果多个.c文件包含时…(链接器直接炸了!)正确姿势:
typedef struct Employee_ {
char* name;
} Employee;
实战场景选择指南(老司机经验谈)
适合裸struct的场景
- 需要明确结构体名称时(比如内核代码)
- 与其他系统交互需要明确类型
- 要定义同名结构体变量时(虽然很少见)
必用typedef的场合
- 函数参数涉及结构体指针时(不然看到吐):
void printStudent(const struct Student* s); // 原版
void printStudent(const Student* s); // typedef版
- 结构体嵌套地狱时:
typedef struct A {
struct B* b_ptr; // 这里必须用struct
} A;
typedef struct B {
A* a_ptr;
} B;
面试官最爱问的死亡三连(赶紧背!)
Q1:以下两种写法有什么区别?
// 写法一
struct Book {
char title[20];
};
typedef struct Book Book;
// 写法二
typedef struct {
char title[20];
} Book;
(答案:写法一可以struct Book
和Book
混用,写法二只能用Book
)
Q2:为什么C++里不用纠结这个?
(因为C++会自动把结构体名作为类型名,但考C语言时别这么说!)
Q3:这样的代码为什么会报错?
typedef struct {
Node* next; // 还没定义完就使用
} Node;
(正确做法是先声明结构体标签)
终极总结(背下就能过面试!)
struct
定义的类型必须带关键字,typedef
造的是"语法糖"- 自引用结构必须用
struct XXX*
形式 - 大型项目建议统一使用typedef(但要知道原理!)
- 笔试遇到这个题,先写"struct用于…,typedef用于…"准没错
最后说个真事:去年面了个五年经验的老哥,结果他在这题上翻车了…(所以别觉得简单就不复习啊!)下次遇到面试官出这个题,你可以邪魅一笑:“您想听C89版本还是C99版本的答案?”