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

相关推荐
zjun10013 分钟前
C++:单例模式
c++·单例模式
GuWenyue8 小时前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法
同勉共进9 小时前
记一例 vibe coding + gcc bug 导致的线程池死锁问题
c++·线程池·gcc·死锁·vibe coding
我叫洋洋9 小时前
C ++ [ hello world ]
c语言·c++·算法
天空'之城10 小时前
C 语言工业级通用组件手写 09:CRC32 数据校验
c语言·嵌入式开发·数据校验·crc32·工业级组件
奋发向前wcx10 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法
王维同学13 小时前
[自学][Windows C++]RunOnceEx 注册表分组键的安全遍历
c++·windows·安全·开源
战族狼魂13 小时前
高频面试题精选:分治与AI Agent架构
人工智能·算法·大模型·大语言模型
李剑一14 小时前
你用过网易的将军令嘛?它底层实现账号保护的原理相当简单粗暴
算法
Scott9999HH14 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法