一.typedef主要功能是定义一个已存在类型的别名,但是和宏并存
宏与typedef区别
1.宏定义只是简单的字符串替换
2.typedef定义的类型是类型的别名,typedef后面是一个整体声明,是不能分割的一个整体,具有一定的封装性,不是简单的字符串替换
看下面的例子:
#define PSTR_MACRO char*
typedef char* PSTR
int main()
{
PSTR piVar1,piVar2;
PSTR_MACRO piVar3,piVar4;
int iVar = 100;
piVar1 = &iVar;
piVar2 = &iVar;
piVar3 = &iVar;
piVar4 = &iVar;
printf("piVar1 = %0X\r\n",piVar1);
printf("piVar2 = %0X\r\n",piVar2);
printf("piVar3 = %0X\r\n",piVar3);
printf("piVar4 = %0X\r\n",piVar4);
}
输出piVar1 = 19FC78
piVar2 = 19FC78
piVar3 = 19FC78
piVar4 =78
typedef主要为复杂的声明定义简单的别名,它本身是一种存储类的关键字,与auto,extern,mutable,static,register等关键字不能出现在同一个表达式中,如typedef static int nValue
typedef的其它用途
1.用在旧的C代码中,声明struct新对象时,必须带上struct,即形式为struct结构体对象名,例如
struct tagPOINT 为了实现在结构体使用过程中少写声明头部分的struct,可采用 typedef struct tagPOINT
{ {
int x; int x;
int y; int y;
}; }POINT;
struct tagPOINT pl; POINT pl;
在C++中,typedef的这种用途不是很大,但理解了它,对掌握以前的旧代码还是有帮助的
2.另外一个用途就是定义与机器无关的类型,保障代码具有较好的跨平台特性。例如,可定义一个名为REAL_NUM的浮点类型,在目标机器上它可以获得最高的精度
typedef long double REAL_NUM
在不支持long double的机器上,通过typedef可采用如下定义
typedef double REAL_NUM
对于连double都不支持的机器上,通过typdedef可采用如下定义
typedef float REAL_NUM;
采用typedef实现数据类型的定义,只需对typedef本身进行修改,不用对源代码做任何修改,便可以在每一种平台上编译这个使用REAL_NUM类型的应用程序
3.为复杂的声明定义一个简单的名称,简化代码。这一功能可增强代码的可读性和标识符的灵活性
例如
int*(*paFunc[6])(char* pszInput) 简化后为typedef int* (*pFunc)(char* pszInput) pFunc paFunc[6]
typedef BOOL *CallBackFunc(const char* pszData,const int nDatalength); CallBackFunc m_pCallBackFunc;
原文:http://www.cnblogs.com/fenghuan/p/4851660.html