typedef用法

1 定义机器无关的类型

typedef long double REAL;

在不支持long double的机器上运行相关代码,只要修改对应的typedef

typedef double REAL;

2 使用typedef为现有类型创建别名

typedef unsigned int UINT;

3 简化一些比较复杂的类型声明(回调函数比较多)

typedef void (*PFunCallBack)(char* pMsg, unsigned int nMsgLen);

上述声明引入了 PFunCallBack 类型作为函数指针的同义字,PFunCallBack 类型定义的指针会指向1个函数,该函数包含两个类型分别为 char* 和 unsigned int 的参数,以及一个类型为 void 的返回值。通常,当函数的参数是一个回调函数时,就可能会使用 typedef 来简化声明。
就可以像下面这样使用:

RedisSubCommand(const string& strKey, PFunCallBack pcb, bool bOnlyOne);

如果不使用typedef声明,则该函数声明如下:

RedisSubCommand(const string& strKey, void (*pFunCallback)(char* pMsg, unsigned int nMsgLen), bool bOnlyOne); 

非常复杂

4 与define的一些区别

  • #define 进行简单的进行字符串替换。 #define 宏定义可以使用 #ifdef、#ifndef 等来进行逻辑判断,还可以使用 #undef 来取消定义。
  • typedef 是为一个类型起新名字。typedef 符合(C语言)范围规则,使用 typedef 定义的变量类型,其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。
    通常,使用 typedef 要比使用 #define 要好,特别是在有指针的场合里
typedef char* pStr1;
#define pStr2 char* 
pStr1 s1, s2; //s1,s2均为指针,相当于char *s1,*s2;
pStr2 s3, s4;//s3是指针,s4是char类型,因为define只是简单的做字符串替换,等于char *s3,s4;
typedef char *pStr;
char string[5]="test";
const char *p1=string;
const pStr p2=string;//不等于直接替换为const char* pStr p2 = string;而是char* const p2 = string;
p1++;
p2++;//会报错

p2++报错是因为这里p2是一个顶层const了,本身是一个常量
也就是说,const pStr p2 和 pStr const p2 本质上没有区别(可类比 const int p2 和 int const p2),都是对变量 p2 进行只读限制,只不过此处变量 p2 的数据类型是我们自己定义的 pStr,而不是系统固有类型(如 int)而已。