C语言---typedef

文章目录

  • [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),除非是为了跨平台兼容性,否则不建议随意起别名,以免增加代码阅读者的认知负担。

相关推荐
十月的皮皮27 分钟前
C语言学习笔记20260606- 求月份天数三种写法
c语言·笔记·学习
搬砖魁首1 小时前
基础能力系列 - 多线程2 - 条件变量
c++·rust·条件变量·原子类型·线程同步互斥
youngerwang1 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
chase_my_dream1 小时前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
牛油果子哥q1 小时前
【C++ STL string 】C++ STL string 终极精讲:底层原理、内存机制、全套API、深浅拷贝、易错坑点与工程实战规范
数据库·c++
KaMeidebaby1 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
caimouse1 小时前
Reactos 第 5 章 进程与线程 — 5.8 Windows 的 APC 机制
c语言·windows
手写码匠2 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
无限码力3 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试
lqqjuly3 小时前
MLA — 多头潜在注意力深度解析
深度学习·神经网络·算法