文章目录
- [1. 基本语法](#1. 基本语法)
- [2. 常见用法](#2. 常见用法)
-
- [(1) 简化复杂的类型声明](#(1) 简化复杂的类型声明)
- [(2) 定义平台无关的类型](#(2) 定义平台无关的类型)
- [(3) 为指针定义别名](#(3) 为指针定义别名)
- [(4) 为函数指针定义别名(最能体现价值的地方)](#(4) 为函数指针定义别名(最能体现价值的地方))
- [3. typedef vs #define 的区别](#define 的区别)
- [4. 使用建议](#4. 使用建议)
typedef 是 C 语言中的一个关键字,用于为现有的数据类型定义一个新的名字(别名)。它并不会创建新的数据类型,只是给已有的类型起了一个"绰号"。
1. 基本语法
bash
typedef 原类型名 新别名;
2. 常见用法
(1) 简化复杂的类型声明
这是 typedef 最常用的场景,尤其是在处理结构体时,可以省略每次声明都要写的 struct 关键字。
bash
typedef struct {
int x;
int y;
} Point;
// 使用别名定义变量,不需要写 struct Point p1;
Point p1;
(2) 定义平台无关的类型
为了提高代码的可移植性,常用 typedef 定义固定长度的整型。例如在 stdint.h 中:
bash
typedef unsigned int uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;
这样在不同位数的 CPU 上,只需修改 typedef 的定义,而不需要改动逻辑代码。
(3) 为指针定义别名
bash
typedef char* String;
String str = "Hello World";
(4) 为函数指针定义别名(最能体现价值的地方)
函数指针的原始语法非常晦涩,使用 typedef 可以极大提高可读性。
bash
// 定义一个名为 Handler 的别名,它是一个函数指针
// 该函数接收两个 int 参数,返回一个 int
typedef int (*Handler)(int, int);
int add(int a, int b) { return a + b; }
int main() {
Handler func = add; // 使用别名定义函数指针变量
int result = func(10, 20);
return 0;
}
3. typedef vs #define 的区别
虽然两者都可以用来简化代码,但有本质区别:
| 特性 | typedef | #define |
|---|---|---|
| 本质 | 编译器处理,给类型起别名 | 预处理器处理,简单的文本替换 |
| 作用域 | 遵循变量作用域规则 | 全局有效(直到 #undef) |
| 安全性 | 有类型检查,更安全 | 无类型检查,仅是字符串替换 |
| 指针处理 | typedef int* P; P a, b; (a, b 都是指针) | #define P int* \n P a, b; (a 是指针, b 是 int) |
4. 使用建议
增强可读性:当类型名太长(如复杂的结构体或函数指针)时使用。
抽象数据类型:如果你以后可能改变某个变量的精度(例如从 float 改为 double),用 typedef 定义一个 RealNumber,修改时只需改动一处。
不要过度使用:对于简单的基本类型(如 int),除非是为了跨平台兼容性,否则不建议随意起别名,以免增加代码阅读者的认知负担。