张赐荣——一位视障程序员。
赐荣小站: www.prc.cx

張賜榮

张赐荣的技术博客

博客园 首页 新随笔 联系 订阅 管理
  92 随笔 :: 27 文章 :: 2 评论 :: 77074 阅读

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 int* intptr;
int a = 10;
intptr x = &a;

上面示例中,intptrint*的别名。不过,使用的时候要小心,这样不容易看出来,变量x是一个指针类型。
typedef 也可以用来为数组类型起别名。

typedef int five_ints[5];
five_ints x = {11, 22, 33, 44, 55};

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

typedef signed char (*fp)(void);

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

主要好处

typedef为类型起别名的好处,主要有下面几点。
(1)更好的代码可读性。

typedef char* STRING;
STRING name;

上面示例为字符指针起别名为STRING,以后使用STRING声明变量时,就可以轻易辨别该变量是字符串。
(2)为 struct、union、enum 等命令定义的复杂数据结构创建别名,从而便于引用。

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

上面示例中,Treestruct 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;

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

typedef long double app_float;

上面命令将变量f1f2f3的类型都改为long double
(4)可移植性
某一个值在不同计算机上的类型,可能是不一样的。

int i = 100000;

上面代码在32位整数的计算机没有问题,但是在16位整数的计算机就会出错。
C 语言的解决办法,就是提供了类型别名,在不同计算机上会解释成不同类型,比如int32_t

int32_t i = 100000;

上面示例将变量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是一个函数指针,指向一个无参数、返回字符值的函数。
posted on   张赐荣  阅读(643)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

感谢访问张赐荣的技术分享博客!
博客地址:https://cnblogs.com/netlog/
知乎主页:https://www.zhihu.com/people/tzujung-chang
个人网站:https://prc.cx/

点击右上角即可分享
微信分享提示