typedef声明,简称typedef,为现有类型创建一个新的名字,或称为类型别名。
typedef不仅可以为变量定义别名,可以为struct定义别名,还可以为函数指针定义别名。
一.为变量定义别名
typedef int size;
这样就为int定义了别名size。
该用法很常见且比较简单
特殊地,当使用typedef为数组定义别名时:
typedefintPoint[2];
这样就可以把一个int[2]的数组定义为Point。使用时:
Point thePt;
thePt[0] = 0;
thePt[1] = 0;
二.为 struct定义别名
对一个struct,
struct POINT
{
int x;
int y;
}
对于C语言,要定义该结构体的变量,需要这样定义:
struct POINT pt;
前面的struct是不能省略的。
因此,才使用typedef为其定义别名:
typedef struct POINT PT;
从而可以:
PT pt;
所以,常见到的用法:
typedef struct //这一行也可写作:typedef struct POINT
{
int x;
int y;
} PT;
其实是两部分功能写在了一起,分别是:
① 定义结构体:
struct POINT
{
int x;
int y;
}
② 为结构体定义别名:
typedef struct POINT PT;
但是,这些仅仅是因为C语言的限制才导致了这样的用法。实际上,C++解决了这个问题,允许用户不加struct关键字来定义一个结构体变量。所以该用法在C++中可以不使用。
三.为函数定义别名
typedef int (*MYFUN)(int, int);
上面的例子定义MYFUN是一个函数指针, 函数类型是带两个int 参数, 返回一个int
在分析这种形式的定义的时候可以用下面的方法:
先去掉typedef和别名,剩下的就是原变量的类型.
去掉typedef和MYFUN以后就剩:
int (*)(int, int)
注意该用法与前面的用法不太一样。前面的用法都是
typedef 原变量名新变量名;
但该用法却是:
typedef 返回值新函数名函数参数;
该新函数名代表了typedef后面的整个表达式。
将一个函数使用typedef定义了一个新函数名,一般该新函数名是一个函数指针。该新函数名可以像一个类名那样使用,来定义变量:
MYFUN pFun1, pFun2;
然后这些变量在使用之前必须被赋值:
int add(int a, int b)
{
return (a + b);
}
int sub(int a, int b)
{
return (a - b);
}
pFun1 = add;
pFun2 = sub;
被赋值后的函数指针变量就有了实体,然后直接使用即可:
cout << pFun1(1, 2) << endl;
cout << pFun2(1, 2) << endl;