0
点赞
收藏
分享

微信扫一扫

[typedef]typedef的高级用法


  问题描述:之前对typedef的认识还是限于易于移植的层面,经常用到typedef unsigned int U32;之类的类型别名。对于typedef的更多高级的用法了解很少,于是查找资料进行了学习。typedef和define的用法有些相同,但是差别也是很大的。两者的相同大概就是具有一个简化替换的作用,但define是纯粹的字符替换,而typedef是为定义的复杂类型起了简单的别名。define是宏,#define U32 unsigned int, 而typedef是类型定义,别名一般不像define一样在前面,而且要用“;”结束。

  高级用法:



1. 如指针、数组一类的新类型定义:



typedef char Line[81];//这里为具有81个字符元素的数组类型起了个别名叫Line


















//char secondline[81];




typedef char *pstr;//这里为指向字符变量的指针类型起了个别名叫pstr




pstr p1;//定义了p1指针,即char *p1;




2. 有const的特殊情况:



typedef char *pstr;













3. 结构中包含指向其自身的指针时:




typedef struct tagNode




{












}*pNode;//这样是错误的,类型本身尚未建立完成而使用pNode,编译器此时是不认识pNode的





以下是三种可行的方式:





typedef struct tagNode




{












}*pNode;





typedef struct tagNode *pNode;




struct tagNode




{












};





struct tagNode




{












};




typedef struct tagNode *pNode;//这种是规范做法



  4. 对复杂变量建立类型别名的方式:



 



例1:int *(*a[5])(int, char*);//这是一个函数指针数组,函数的输入参数为int和char*类型,返回值为int型的指针

typedef int *(*pFun)(int, char*);//pFun是建的一个类型别名

pFun a[5];//使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*);

例2:void (*b[10]) (void (*)());

typedef void (*pFunParam)();//首先为上面表达式(void (*)())部分声明一个新类型

typedef void (*pFun)(pFunParam);//整体声明一个新类型

pFun b[10];//使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)());

例3:double(*(*pa)[9])();

typedef double(*pFun)();//首先为整体声明一个新类型

typedef pFun (*pFunParam)[9];//再为上面((*pa)[9])部分声明一个新类型

pFunParam pa;//使用定义的新类型来声明对象,等价于double(*(*pa)[9])();

举报

相关推荐

0 条评论