引用贴:http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.html
首先#define为预处理,与typedef是完全不同的机制。详细机制尚未完全明了。请参考前人文章。
用法一:指针变量代替。
char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,和一个字符变量
typedef char* PCHAR; // 别名不建议全大写
PCHAR pa, pb; // 这是两个char类型的指针。
原文认为这种方法很有用。但个人认为这种方法容易引起误解。如果要使用,需要在变量名中有指针的隐含指示。
用法二:struct的使用省略。
struct tagPOINT1
{
int x;
int y;
};
struct tagPOINT1 p1;
如果使用typedef,则可以这样:
typedef struct tagPOINT
{
int x;
int y;
}POINT;
POINT p1; // 这样就比原来的方式少写了一个struct。不建议使用此方式。但需要能够理解他人代码中这样的使用。
用法三:用typedef来定义与平台无关的类型。(个人认为最常用的用法)
REAL代表最高精度的浮点数。
typedef long double REAL; //最高支持lond double 平台
typedef double REAL;//最高支持double 平台
typedef float REAL;//最高支持float 平台
也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。
用法四:对类,定义一个容易理解的别名。
例子1:
class ABC{ /*code*/ };
typedef ABC Rectangle;
你看到ABC肯定不知道这个类是做什么用的。但当你看到Rectangle最少你应该知道这个类是一个矩形。
PS:不建议任何人构建ABC这种类。但你无法控制所有人。所以有时候Typedef是一个很好的选择。
例子2:
template< class typeA > class ABC{ /* code */ };
typedef < calss AAA >ABC RectangleA;
typedef < calss BBB >ABC RectangleB;
此例子中变量名非常不推荐。因此为上份工作的代码。所以只能使用AAA和BBB代替。但从中应该也能看到用法。
用法五:函数指针的别名。
格式:typedef 返回类型(*新类型)(参数表)
typedef char (*ptrFun)(int);
ptrFun pFun;
char getInt(int a){ return a;}
int main()
{
pFun = getInt;
cout<< (*pFun)(2) << endls;
return 0;
}
暂未使用此方式来编写代码。但存在即合理。本质上,和类的别名无什么区别。
一个未试验的猜想:是否可以将 *ptrFun 变为 ptrFun ?
解答原文的一个问题:(仅个人认知,不代表绝对正确。欢迎讨论)
原文案例:
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;
原文中,指出P2++将会出错。
1:pStr是一个自定义的类型,在前面加const将会使我们无法改变这个类型的值。
2:反推论,这个pStr是保存的是一个指针。具体内容为指针地址。当对指针地址进行++时,会改变具体内容。所以报错。