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 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;
- TYPEDEF用法
- typedef用法
- typedef用法
- typedef用法
- typedef用法
- typedef用法
- typedef用法
- typedef 用法
- typedef用法
- typedef用法
- typedef 用法
- typedef用法
- typedef用法
- typedef用法
- typedef用法
- typedef用法
- typedef用法
- typedef用法
- linux下字符串和整型互转
- VMware 安装 ubuntu
- Eclipse java swing开发环境
- Fedora 常用软件安装
- 四维空间---概念
- typedef用法
- 使用rsync同步镜像服务器数据,安装记录
- C++标准库简介
- C# 端口扫描
- JVM性能调优
- Firefox浏览器代理配置(移动版本)
- 黑马程序员_API
- designer导入xml遇到的怪事
- SSIS 错误代码 DTS_E_OLEDB_EXCEL_NOT_SUPPORTED 没有可用的 OLE DB 访问接口 SSIS 的 64 位版本中不支持 Excel 连接管理器