typedef用法总结。

引用贴: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是保存的是一个指针。具体内容为指针地址。当对指针地址进行++时,会改变具体内容。所以报错。

原文地址:https://www.cnblogs.com/zheng39562/p/4164301.html