文档章节

第14章 结构和其他数据形式 14.12 typedef 简介

idreamo
 idreamo
发布于 2017/03/27 05:34
字数 1102
阅读 16
收藏 0

typedef工具是一种高级数据特性,它使您能够为某一类型创建您自己的名字。在这方面,它和#define相似,但是它们有3个不同之处:

1、与#define不同,typedef给出的符号名称仅限于对类型,而不是对值 。

2、typedef的解释由编译器,而不是预处理器执行。

3、虽然它的范围有限,但在其受限范围内,typedef比#define更灵活。

假设要对1字节的数值使用术语BYTE,您只须像定义一个char变量那样定义BYTE,然后在这个定义前面加上关键字typedef,如:

typedef unsigned char BYTE;

随后,您就可以使用BYTE来定义变量了:

BYTE x,y[10], *z;

该定义的作用域取决于typedef语句所在的位置,如果定义在一个函数内部,它的作用域限定在那个函数里,如果定义在函数外部,它将具有全局作用域。

通常,这些定义使用大写字母,以提醒这个类型名称实际上是一个符号缩写。

管理变量名的同样规则也用来管理typedef使用的名字。

在前面的例子中,使用BYTE来代替unsigned char有助于说明您打算用BYTE变量来表示数值而非字符编码。使用typedef也有助于增加可移植性。例如,我们已经提到过表示sizeof运算符返回类型的size_t类型,以及表示函数time()的返回值类型的time_t类型。C标准规定sizeof和time()应返回整数类型,但它留给具体的实现来决定到底是哪种整数类型。不进行指定的原因是ANSI C委员会觉得没有一个对所有计算机平台来说都是最好的选择。因此,他们提出一个新类型名称,如,time_t,让C实现使用typedef来把这个名称设定为某种特定的数据类型。这样,他们可以提供以下通用原型:

time_t time(time_t *);

在一个系统上,time_t可能是unsigned int类型;在另一个系统上,它可能是unsigned long类型。只要包含了time.h头文件,程序就可以访问适当的定义,您也可以在代码中声明time_t变量。

使用#define可以实现typedef的一部分功能,例如:

#define BYTE unsigned char

这使预处理器用unsigned char来代替BYTE。但也有#define实现不了的功能,如下例所示:

typedef char * STRING;

如果没有关键字typedef,该例将STRING识别为一个char指针,有了这个关键字,使STRING成为char指针 的标识符。因此:

STRING name,sign;

意思是:

char *name,*sign;

但是假设这样做:

#define STRING char*

那么:

STRING name,sign;

将会被翻译成下面的形式:

char *name,sign;

在这种情况下,只有name是一个指针。

也可以对结构使用typedef:

typedef struct complex{
    float real;
    float imag;
}COMPLEX;

这样您就可以使用COMPLEX代替struct complex来表示复数。使用typedef的一个原因是为经常出现的类型创建一个方便的、可识别的名称。

使用typedef来命名一个结构类型时,可以省去结构的标记:

typedef struct {double x;double y;} rect ;

假设像下面这样使用typedef定义的类型名:

rect r1={3.0,6.0};

rect r2;

r2=r1;

将被翻译成:

struct {double x;doubley;} r1={3.0,6.0};

struct {double x;double y;} r2;

r2=r1;

如果两个结构的声明都不使用标记,但是使用相同的成员(成员名和类型都匹配),那么C认为这两个结构具有同样的类型,因此将r1赋给r2是一个正确的操作。

使用typedef的另一个原因是,typedef名称经常被用于复杂的类型。例如

typedef char (*FRPTC())[5];

这把FRPTC声明为一个函数类型,该类型的函数返回一个指向含有5个元素的char数组的指针。

当使用typedef时,要记住它不是创建新的类型,它只是创建了便于使用的标签 。这意味着,例如,我们创建的STRING类型的变量可以作为参数传递给需要char指针类型参数的函数 。

通过结构、联合和typedef,C提供了有效和方便地处理数据的工具。

© 著作权归作者所有

idreamo
粉丝 17
博文 139
码字总数 224743
作品 0
青岛
产品经理
私信 提问
《Oracle数据库基础与应用教程》一本Oracle入门教材

《Oracle数据库基础与应用教程》书全面讲述了Oracle数据库的日常管理工作内容。全书共14章,包含Oracle简介和安装、Oracle客户端、管理Oracle环境、Oracle体系结构、管理Oracle存储结构、SQL...

airfish2000
2016/08/30
0
0
好书推荐.flask.>

图书封面: 书籍简介: 1. 学习Flask应用的基本结构,编写示例应用; 使用必备的组件,包括模板,数据库,Web表单和电子邮件支持; 使用包和模块构建可伸缩的大型应用; 实现用户认证,角色和个人资...

满满李
2016/06/03
97
0
【书评:Oracle查询优化改写】第14章 结尾章

【书评:Oracle查询优化改写】第14章 结尾章 一.1 相关参考文章链接 前13章的链接参考相关连接: 【书评:Oracle查询优化改写】第一章 http://blog.itpub.net/26736162/viewspace-1652985/ 【书...

技术小胖子
2017/11/08
0
0
《实战Nginx:取代 Apache的高性能Web服务器》pdf下载

目录介绍: 第1部分 基础篇 第1章 Nginx简介 1.1 常用的Web服务器简介 1.2 Nginx简介 1.3 选择Nginx的理由 1.4 Nginx与Apache、Lighttpd的综合对比 第2章 Nginx服务器的安装与配置 2.1 安装N...

绿悠悠
2010/06/17
17K
36
二十三、typedef

说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略 这讲介绍C语言中很...

长平狐
2013/03/28
141
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
9
0
多线程同时加载缓存实现

import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorServi......

暗中观察
昨天
3
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
2
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部