14.typedef 命令

简介: 14.typedef 命令

十四、typedef 命令

1.typedef简介

typedef 命令用来为某个类型起别名。


typedef type name;

上面代码中, type 代表类型名, name 代表别名。


typedef unsigned char BYTE;
BYTE c = 'z';

上面示例中, typedef 命令为类型 unsign char 起别名 BYTE ,然后就可以使用 BYTE 声明变量。

typedef 可以一次指定多个别名。

typedef int antelope, bagel, mushroom;

上面示例中,一次性为 int 类型起了三个别名。

typedef 可以为指针起别名。

typedef unsigned char BYTE;
BYTE c = 'z';

上面示例中, intptr 是 int* 的别名。不过,使用的时候要小心,这样不容易看出来,变量 x 是一个指针类型。

typedef 也可以用来为数组类型起别名。

typedef int* intptr;
int a = 10;
intptr x = &a;

上面示例中, five_ints 是一个数组类型,包含5个整数的typedef 为函数起别名的写法如下。

typedef signed char (*fp)(void);

上面示例中,类型别名 fp 是一个指针,代表函数 signed char (*)(void) 。


2.typedef主要好处

typedef 为类型起别名的好处,主要有下面几点。


(1)更好的代码可读性。

typedef char* STRING;
STRING name;

上面示例为字符指针起别名为 STRING ,以后使用 STRING 声明变量时,就可以轻易辨别该变量是字符串。


(2)为 struct、union、enum 等命令定义的复杂数据结构创建别名,从而便于引用。

struct treenode {
  // ...
};
typedef struct treenode* Tree;

上面示例中, Tree 为 struct treenode* 的别名。

typedef 也可以与 struct 定义数据类型的命令写在一起。

typedef struct animal {
  char* name;
  int leg_count, speed;
} animal;

上面示例中,自定义数据类型时,同时使用 typedef 命令,为 struct animal 起了一个别名 animal 。

这种情况下,C 语言允许省略 struct 命令后面的类型名。

typedef struct {
  char *name;
  int leg_count, speed;
} animal;

上面示例相当于为一个匿名的数据类型起了别名 animal 。


(3)typedef 方便以后为变量改类型。

typedef float app_float;
app_float f1, f2, f3;

上面示例中,变量 f1 、 f2 、 f3 的类型都是 float 。如果以后需要为它们改类型,只需要修改typedef 语句即可。

typedef long double app_float;

上面命令将变量 f1 、 f2 、 f3 的类型都改为 long double 。


(4)可移植性

某一个值在不同计算机上的类型,可能是不一样的。

int i = 100000;

上面代码在32位整数的计算机没有问题,但是在16位整数的计算机就会出错。

C 语言的解决办法,就是提供了类型别名,在不同计算机上会解释成不同类型,比如 int32_t 。

typedef long int ptrdiff_t;
typedef unsigned long int size_t;
typedef int wchar_t;

上面示例将变量 i 声明成 int32_t 类型,保证它在不同计算机上都是32位宽度,移植代码时就不会出错。

这一类的类型别名都是用 typedef 定义的。下面是类似的例子。

typedef long int ptrdiff_t;
typedef unsigned long int size_t;
typedef int wchar_t;

这些整数类型别名都放在头文件 stdint.h ,不同架构的计算机只需修改这个头文件即可,而无需修改代码。

因此, typedef 有助于提高代码的可移植性,使其能适配不同架构的计算机。


(5)简化类型声明

C 语言有些类型声明相当复杂,比如下面这个。


char (*(*x(void))[5])(void);

typedef 可以简化复杂的类型声明,使其更容易理解。首先,最外面一层起一个类型别名。

typedef char (*Func)(void);
Func (*x(void))[5];

这个看起来还是有点复杂,就为里面一层也定义一个别名。

typedef char (*Func)(void);
typedef Func Arr[5];
Arr* x(void);

上面代码就比较容易解读了。


x 是一个函数,返回一个指向 Arr 类型的指针。

Arr 是一个数组,有5个成员,每个成员是 Func 类型。

Func 是一个函数指针,指向一个无参数、返回字符值的函数。


目录
相关文章
|
11月前
|
人工智能 算法 5G
政务大厅智能引导系统的技术解构:如何用数字基座破解“寻路难”困局?
本文介绍了政务大厅智能导航系统的创新技术与实践应用。未来,智能引导系统将从被动指引进化为主动服务,结合5G、AIoT和数字孪生技术,推动政务服务数字化转型,助力“一网通办”等改革措施落地。
304 1
|
开发工具 JavaScript 容器
【HarmonyOS 5】鸿蒙中常见的标题栏布局方案
【HarmonyOS 5】鸿蒙中常见的标题栏布局方案
238 0
|
负载均衡 网络安全 网络虚拟化
双ISP(双互联网服务提供商)
双ISP(双互联网服务提供商)指同时接入两家网络服务商,通过冗余备份、负载均衡和路径优化提升网络稳定性、速度与安全性。适用于企业关键业务、跨境服务及家庭高需求用户。实现方式包括硬件(双WAN口路由器、双网卡服务器)、软件(BGP多线接入、VPN多路径)及运营商套餐。优点为更稳定、更快速、更强抗攻击能力;缺点是成本较高且配置复杂。适合外贸公司等对网络要求高的场景,需权衡成本与技术难度。
1479 3
|
8月前
|
机器学习/深度学习 算法 安全
新型电力系统下多分布式电源接入配电网承载力评估方法研究(Matlab代码实现)
新型电力系统下多分布式电源接入配电网承载力评估方法研究(Matlab代码实现)
270 3
|
运维 容灾 安全
国网安徽电力与阿里云联合完成行业首个全场景容灾演练
在安徽合肥的一座不起眼的数据中心里,一场没有硝烟的“战役”悄然打响。这不是一次普通的系统升级,而是一场关乎全省电网稳定运行的关键演练——这是一场关于数据、系统、故障和时间的较量,将验证电力系统背后的数据中心在碰到故障时,是否能够做到“不停电、不掉线”。 这场演练的主角,是我们身边默默守护万家灯火的电力人——国网安徽电力以及背后的技术团队,大家的目标是在极端情况下保障电网云平台稳定运行,确保每一台服务器、每一套业务系统“永不宕机”。这次演练,不仅是加速构建新型电力系统、增强电网“灵活可靠”的一次探索,也是能源电力行业迈向智能化、数字化过程中的一次真实实践。
449 11
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
530 5
|
SQL 存储 关系型数据库
MySQL8.0之执行计划
MySQL8.0.17 执行计划
2915 0
|
机器学习/深度学习 算法 前端开发
从k折到自助法:常用交叉验证方法的优缺点
为了评估和改进机器学习(ML)算法的可靠性和泛化能力,交叉验证已被广泛采用[1]。交叉验证是一种在有限数据集上评估和比较不同模型性能的方法,其通过分割数据集为训练集和测试集以验证模型的性能。通过使用交叉验证,研究人员可以避免对单一实验的依赖,因此可以更好地评估模型的泛化能力。
6219 0
|
存储 运维 监控
语雀故障与反思,随便再领半年会员!
语雀故障与反思,随便再领半年会员!
688 0