第14章 结构和其他数据形式 14.12 typedef 简介
2017-03-27 00:00
507 查看
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:
这样您就可以使用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提供了有效和方便地处理数据的工具。
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提供了有效和方便地处理数据的工具。
相关文章推荐
- 第14章 结构和其他数据形式 14.10 联合简介
- 结构和其他数据形式 联合简介
- 第14章 结构和其他数据形式 14.3 定义结构变量
- 第14章 结构和其他数据形式 14.7 向函数传递结构信息
- 第14章 结构和其他数据形式 14.13 奇特的声明
- 第14章 结构和其他数据形式 14.11 枚举类型
- C primer plus第14章(结构和其他数据形式)
- c primer plus第14章总结:结构和其他数据形式
- 第14章 结构和其他数据形式 14.9 结构下一步是什么
- 第14章 结构和其他数据形式 14.5 嵌套结构
- 第14章 结构和其他数据形式 14.1 示例问题:创建图书目录
- 第14章 结构和其他数据形式 14.6 指向结构的指针
- 第14章 结构和其他数据形式 14.18 编程练习
- C primer plus第14章(结构和其他数据形式)(练习)
- 第14章 结构和其他数据形式 14.14 函数和指针
- 第14章 结构和其他数据形式 14.2 建立结构声明
- 第14章 结构和其他数据形式 14.4 结构数组
- 第14章 结构和其他数据形式 14.8 把结构内容保存到文件中
- 结构和其他数据形式 指向结构的指针
- C结构与其他数据形式学习心得