typedef 这个关键字用于给一个类型起个新的名字,和define不同, typedef 给出的符号名称仅限于对类型 , 而不是对值。下面是一个例子:
typedef short wchar;
typedef将short类型定义成wchar类型,那么以后遇到 wchar a; 其实就是 short a; 如果没有typedef这个关键字,wchar就是一个变量名,加上typedef,wchar就成了类型名。类型名也遵循标识符的命名规则,并且通常加个 _t 后缀,表示Type。
这样做有什么用处呢?仅仅从short这种基本类型是看不出来好处的,typedef的强大之处在于重定义复合类型,给复合类型一个新的名字,以后就可以直接使用新名字来声明变量,而不必写一堆长长的复合类型。当然,某些情况下,也需要对基本类型重命名,比如平台移植之类的。
下面分几种情况描述typedef的用法。
1、指针
考虑这么一个声明:
typedef char * string;
那么string就是一个指针类型,它指向char类型。于是,
string a,b;
就定义了两个指针变量,它们都指向char类型的变量。相当于:
char *a, *b;
2、数组
typedef int array[5];
array就是一种新类型,它代表有5个int类型数值的数组,array new; 就相当于 int new[5];
这个形式理解起来有点费力,可以采用上面的方法:如果没有typedef,那么array就是一个普通的数组名;有了typedef , array就成了一个类型名。
3、结构体
结构是typedef的主要战场,因为一般结构体实在太长了,只有重命名才能简化代码。比如下面这个:
struct {
int a;
double *b;
char name;
} sth;
然后,声明变量时虽然可以这样: struct sth one, two; 但是每次都要写一个struct仍然比较烦。好的办法是这样:
typedef struct {
int a;
double *b;
char name;
} sth;
然后就可以直接 sth one, two; 了。
4、函数
你没看错,typedef甚至可以定义函数类型!!如下:
typedef int func(double var);
这样就定义了一个函数类型func,以后就可以用func来定义变量。这条语句的理解同上面,先去掉typedef,再加上typedef,看func的含义变化。
比如下面的语句定义了一个func型变量:
func a;
但是这个变量不能被赋值,因为这条语句相当于做了一个声明:
int a(double var);
然而这也是定义func类型的初衷,定义func类型是为了方便定义指向此类函数的指针,如下:
func *a;
这样就定义了一个函数指针a,它只能指向func类型的函数,所谓func类型的函数是指:返回值为int,而参数只有一个double。也就是说,判断一个函数是不是func型的,只需要检查它的返回值类型,参数个数及类型,而不管具体的实现。
比如下面实现了两个func型函数:
int func1(double var1)
{
return (int)var1;
}
int func2(double var2)
{
return 0;
}
那么我们可以令a = &func1; 也可以 a = &func2;
这里需要探讨一下函数名到底意味着什么?实际上,函数名同数组名一样,是一个地址。数组名代表着数组首元素的地址,函数名代表着函数第一条指令的地址。
既然函数名就是地址,我们当然也可以这样赋值:a = func1; 这同数组名是一样的,但是这种赋值暗含了类型转换,func1是func函数类型(的变量?),而&func1则是函数指针类型(的变量?),只是做右值时自动类型转换罢了。
赋值时候才可以直接使用函数指针,如:
a(2.6);
相当于调用func1(2.6); (如果a = func1)
以上就是typedef的一些主要用法。