typedef用来为声明定义简单的别名,与宏定义有些差异。它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中,例如typedef static int INT2; 并不可行。
typedef可以定义一种类型的别名
typedef可以定义一种类型的别名,声明的别名一般用大写的英文字符,下面是一个实例:
#include "stdafx.h"
#include <iostream>
using namespace std;
typedef long double REAL;
typedef char* PCHAR; // 一般用大写
#define DPCHAR char *
int _tmain(int argc, _TCHAR* argv[]) {
REAL a=1;
PCHAR cp;
PCHAR cp1,cp11;//此行等于char * cp1;char * cp11;
DPCHAR cp2,cp22;//此行等于char * cp2,cp22
char c='c';
char cs[2]={'x','y'};
cp=&c;
cp1=cs;
cp11=cs;
cp2=cs;
//cp22=&c;//此处报错,cp22不是字符指针
//cp22=cs;//此处报错,cp22不是字符数组指针
cout<<"a="<<a<<endl;
cout<<"cp->"<<*cp<<endl;
cout<<"cs->"<<cs[1]<<endl;
cout<<"cp1->"<<cp1[1]<<endl;
cout<<"cp11->"<<cp11[1]<<endl;
cout<<"cp2->"<<cp2[1]<<endl;
getchar();
return 0;
}
运行结果:
1、typedef不只是简单的宏替换,PCHAR和DPCHAR的效果是不一样的,PCHAR必须从实际意义上来使用,即它是个字符或者字符数的指针类型;DPCHAR则不需用这么考虑,他只是字符直接替换而已。
2、REAL可以是与平台无关的类型,在不支持 long double的平台二上,改为:typedef double REAL; 在连 double都不支持的平台三上,改为:typedef float REAL; 也就是说,当跨平台时,只要改下typedef本身就行,不用对其他源码做任何修改。
为复杂的声明定义一个新的简单的别名
对于以下两个声明:
int *(*aa[5])(int, char*);
void (*bb[10]) (void (*)());
如果有多个同样的声明无疑是一种麻烦的事情,
typedef可以为复杂的声明定义一个新的简单的别名,这样就省事多了:
typedef int *(*pFun)(int, char*);
typedef void (*pFunParam)();
typedef void (*pFunx)(pFunParam);
这样就可以用别名来声明aa和bb了:
pFun aa[5];
pFunx bb[10];
帮助struct声明新对象
typedef用在旧的C的代码中,帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名对象名,如:
struct tagPOINT1
{
int x;
int y;
};
struct tagPOINT1 p1;
我们可以用
typedef给tagPOINT1起个别名,然后就不用再在声明时候加个struct了:
typedef struct tagPOINT1
{
int x;
int y;
} * TAGSTRUCT;
TAGSTRUCT p1;
这种情况只在老的c语言中有用,现在已经没有意义了,估计是有人给优化了,所以现在既不用struct也不用typedef了:
struct tagPOINT1
{
int x;
int y;
};
tagPOINT1 p1;