typedef 是 C 语言中给数据类型起别名的关键字,不是创建新类型,只是给已有类型(基本类型、指针、数组、结构体、枚举等)起一个更简洁、更易懂的名字。
核心作用:简化代码、提高可读性、方便维护。
一、基本语法
typedef 原类型名 别名;
使用时,别名完全等价于原类型。
二、最常用的 5 种用法
1. 简化基本数据类型
给 int、char、long 等起短别名,代码更简洁。
cpp
#include <stdio.h>
// 给int起别名u32
typedef int u32;
// 给unsigned int起别名uint
typedef unsigned int uint;
int main() {
// 等价于 int a = 10;
u32 a = 10;
// 等价于 unsigned int b = 20;
uint b = 20;
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
2. 简化复杂指针类型
指针类型写起来繁琐,用 typedef 一键简化。
cpp
#include <stdio.h>
// 给int*起别名int_ptr
typedef int* int_ptr;
// 给char*起别名str
typedef char* str;
int main() {
int a = 100;
// 等价于 int* p = &a;
int_ptr p = &a;
// 等价于 char* s = "hello";
str s = "hello";
printf("%d\n", *p);
printf("%s\n", s);
return 0;
}
3. 简化结构体(最常用!)
结构体默认写法需要带 struct 关键字,很麻烦,typedef 可以直接省略。
普通结构体写法(繁琐):
struct Student {
char name[20];
int age;
};
// 使用时必须写 struct Student
struct Student stu = {"张三", 18};
typedef 简化写法(推荐):
cpp
#include <stdio.h>
// 给struct Student起别名Stu
typedef struct Student {
char name[20];
int age;
} Stu;
int main() {
// 直接用别名Stu,不用写struct
Stu stu = {"张三", 18};
printf("%s", stu.name);
printf("%d", stu.age);
return 0;
}
极简写法(常用):
cpp
// 直接定义+起别名,省略结构体名
typedef struct {
char name[20];
int age;
} Stu;
4. 简化枚举类型
和结构体用法完全一致,省略 enum 关键字。
cpp
// 给enum Color起别名Color
typedef enum {
RED,
GREEN,
BLUE
} Color;
int main() {
Color c = GREEN;
printf("%d", c);
return 0;
}
5. 简化数组类型
给数组起别名,定义数组更简洁。
// 给int[5]起别名int_arr
typedef int int_arr[5];
int main() {
// 等价于 int arr[5];
int_arr arr;
arr[0] = 10;
return 0;
}
三、typedef 和 #define 的区别(重点)
很多人会混淆,两者完全不同:
typedef:给类型起别名,是编译器级别的处理,有作用域。#define:单纯文本替换,是预处理器处理,无类型检查。
错误示例(#define 的坑):
// 文本替换:int* a, b; → a是指针,b是int
#define int_ptr int*
int_ptr a, b;
// 正确:int_ptr 是int*别名,a和b都是指针
typedef int* int_ptr;
int_ptr a, b;
四、实际开发中的好处
- 跨平台兼容 :不同系统 int 长度不同,用
typedef改一处即可适配全代码。 - 代码更简洁:复杂类型(结构体指针、函数指针)一键简化。
- 可读性更高 :用
u8、u16、Stu等见名知意。
总结
typedef= 给已有数据类型 起别名,不创建新类型;- 核心用法:简化结构体、指针、基本类型;
- 结构体用
typedef是开发标配写法; - 区分
typedef(类型别名)和#define(文本替换)。