
问题描述: 以前对typedef的理解仍然仅限于易于移植的级别,并且类型别名(如typedef unsigned intU32)也是如此. 经常使用. 对于typedef的更高级用法知之甚少,因此我搜索了信息并进行了研究. typedef和define的用法有些相同,但是区别也很大. 两者之间的区别可能是简化的替换,但是define是纯字符替换,而typedef是定义的复杂类型的简单别名. define是一个宏,#defineU32 unsigned int,typedef是一个类型定义typedef用法,别名通常不像define那样位于最前面,并且必须以“;”结尾.
高级用法:
1. 新的类型定义,例如指针和数组:
typedef char Line [81]; //这里有81个字符元素的数组类型的单独名称称为Line
行文本,第二行; //为文本和第二行定义两个具有81个字符元素的数组,即chartext [81]; // char secondline [81];
typedef char * pstr; //这是指向名为pstr的字符变量的指针类型的单独名称
pstr p1; //定义了p1指针,即char * p1;
2. const有一些特殊情况:
typedef char * pstr;
const pstr p1; //使用这种方式是有问题的. 在typedef之后,它不是简单的替换,它也不会成为const char * p1;但是p1将被指定// const限制

3. 当结构包含指向自身的指针时:
///////////////////////////////////////////////// // /
typedef struct tagNode
{
char * pItem;
pNode pNext;
} * pNode; //这是错误的,类型本身尚未创建并使用pNode,编译器此时不知道pNode
///////////////////////////////////////////////// // /
以下是三种可能的方式:
///////////////////////////////////////////////// // /

typedef struct tagNode
{
char * pItem;
struct tagNode * pNext;
} * pNode;
///////////////////////////////////////////////// // /
typedef struct tagNode * pNode;
struct tagNode
{
char * pItem;

pNode pNext;
};
///////////////////////////////////////////////// // /
struct tagNode
{
char * pItem;
struct tagNode * pNext;
};
typedef struct tagNode * pNode; //这是标准做法
///////////////////////////////////////////////// // /

4. 为复杂变量创建类型别名的方法:
只需在传统变量声明表达式中用类型名称替换变量名称,然后将关键字typedef添加到语句的开头即可.
示例1: int *(* a [5])(inttypedef用法,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); //从整体上声明一个新类型
pFunb [10]; //使用定义的新类型来声明对象,它等效于void(* b [10])(void(*)());
示例3: double(*(* pa)[9])();
typedefdouble(* pFun)(); //首先为整体声明一个新类型
typedef pFun(* pFunParam)[9]; //为上述((* pa)[9])部分声明一个新类型
pFunParampa; //使用定义的新类型来声明对象,它等同于double(*(* pa)[9])();
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-257979-1.html
小王子~
锅炉