typedef用法

来源:互联网 发布:山东兆物网络李民 编辑:程序博客网 时间:2024/05/23 00:07

今天看到

typedef quint16
Typedef for unsigned short. This type is guaranteed to be 16-bit on all platforms supported by Qt.

一下Typedef用法来自百度百科:


typedef 声明,简称 typedef,为现有类型创建一个新的名字,或称为类型别名,在结构体定义,还有一些数组等地方都大量的用到。

它有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法

typedef int size; 

 //此声明定义了一个 int 的同义字,名字为 size。注意 typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要 int 的上下文中使用 size:

typedef 还可以掩饰复合类型,如指针和数组。


例如,你不用像下面这样重复定义有 81 个字符元素的数组:  char line[81];  char text[81];  定义一个 typedef,每当要用到相同类型和大小的数组时,可以这样:  typedef char Line[81];  此时Line类型即代表了具有81个元素的字符数组,使用方法如下:  Line text, secondline;  getline(text);

同样,可以象下面这样隐藏指针语法:

typedef const char* pstr;

int mystrcmp(pstr, pstr);//标准函数 strcmp()有两个‘ const char *'类型的参数


typedef int (*PF) (const char *, const char *); 

 这个声明引入了 PF 类型作为函数指针的同义字,该函数有两个 const char * 类型的参数以及一个 int 类型的返回值。如果要使用下列形式的函数声明,那么上述这个 typedef 是不可或缺的:  PF Register(PF pf);  Register() 的参数是一个 PF 类型的回调函数,返回某个函数的地址,其署名与先前注册的名字相同。做一次深呼吸。下面我展示一下如果不用 typedef,我们是如何实现这个声明的:  int (*Register (int (*pf)(const char *, const char *))) (const char *, const char *);

typedef 和存储类关键字(storage class specifier)

typedef 就像 auto,extern,mutable,static,和 register 一样,是一个存储类关键字。

typedef register int FAST_COUNTER; // 错误  

编译通不过。问题出在你不能在声明中有多个存储类关键字。因为符号 typedef 已经占据了存储类关键字的位置,在 typedef 声明中不能用 register(或任何其它存储类关键字)。

1、typedef的最简单使用  typedef long byte_4;  给已知数据类型long起个新名字,叫byte_4。  

2、 typedef与结构结合使用  

typedef struct tagMyStruct 

 { 

 int iNum;  

long lLength;  

} MyStruct; 

 这语句实际上完成两个操作: 

 1) 定义一个新的结构类型  struct tagMyStruct  {  int iNum;  long lLength;  }; 

 分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。

我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。 

 2) typedef为这个新的结构起了一个名字,叫MyStruct。  typedef struct tagMyStruct MyStruct;  因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。

C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子

2. typedef & 结构的问题  

当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?

typedef struct tagNode 

 {  char *pItem;  

          pNode pNext;  

  } *pNode;

根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。

 解决这个问题的方法有多种:  

1)、  typedef struct tagNode  {  char *pItem;  struct tagNode *pNext;  } *pNode;  

2)、  typedef struct tagNode *pNode;  struct tagNode  {  char *pItem;  pNode pNext;  };  注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。  

3)、规范做法:  struct tagNode  {  char *pItem;  struct tagNode *pNext;  };  typedef struct tagNode *pNode;


原创粉丝点击