那些年掉过的坑:typedef struct和struct到底有啥区别?(血泪总结版)

当结构体遇上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的场景

  1. 需要明确结构体名称时(比如内核代码)
  2. 与其他系统交互需要明确类型
  3. 要定义同名结构体变量时(虽然很少见)

必用typedef的场合

  1. 函数参数涉及结构体指针时(不然看到吐):
void printStudent(const struct Student* s);  // 原版
void printStudent(const Student* s);         // typedef版
  1. 结构体嵌套地狱时:
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 BookBook混用,写法二只能用Book

Q2:为什么C++里不用纠结这个?

(因为C++会自动把结构体名作为类型名,但考C语言时别这么说!)

Q3:这样的代码为什么会报错?

typedef struct {
    Node* next;  // 还没定义完就使用
} Node;

(正确做法是先声明结构体标签)

终极总结(背下就能过面试!)

  1. struct定义的类型必须带关键字,typedef造的是"语法糖"
  2. 自引用结构必须用struct XXX*形式
  3. 大型项目建议统一使用typedef(但要知道原理!)
  4. 笔试遇到这个题,先写"struct用于…,typedef用于…"准没错

最后说个真事:去年面了个五年经验的老哥,结果他在这题上翻车了…(所以别觉得简单就不复习啊!)下次遇到面试官出这个题,你可以邪魅一笑:“您想听C89版本还是C99版本的答案?”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值