- 首页
- 作品
- C 语言教程
- 13. C语言的 typedef 命令
13. C语言的 typedef 命令
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;
- 上面示例中,
intptr
是int*
的别名。不过,使用的时候要小心,这样不容易看出来,变量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
为类型起别名的好处,主要有下面几点。
- 更好的代码可读性。
typedef char* STRING;
STRING name;
- 上面示例为字符指针起别名为
STRING
,以后使用STRING
声明变量时,就可以轻易辨别该变量是字符串。
- 为 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;
- (4)可移植性
- (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
是一个函数指针,指向一个无参数、返回字符值的函数。
下一节:C 语言提供了 Union 结构,用来自定义可以灵活变更的数据结构。