🍏typedef
2021-1-25
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
typedef工具是一个高级数据特性,利用typedef可以为某一类型自定义名称。这方面与#define类似,但是两者有3处不同:
  • 与#define不同,typedef创建的符号名只受限于类型,不能用于值
  • typedef由编译器解释,不是预处理器
  • 在其受限范围内,typedef比#define更灵活
 
假设要用BYTE表示1字节的数组。只需像定义个char类型变量一样定义BYTE,然后在定义前面加上关键字typedef即 可:
随后,便可使用BYTE来定义变量:
该定义的作用域取决于typedef定义所在的位置。如果定义在函数中,就具有局部作用域,受限于定义所在的函数。如果定义在函数外面,就具有文件作用域。
 
为现有类型创建一个名称,看上去真是多此一举,但是它有时的确很有用。在前面的示例中,用BYTE代替unsigned char表明你打算用BYTE类型的变量表示数字,而不是字符码。使用typedef还能提高程序的可移植性。例如之前提到的sizeof运算符的返回类型:size_t类型,以及time()函数的返回类型:time_t类型。C标准规定sizeof和time()返回整数类型,但是让实现来决定具体是什么整数类型。其原因是,C 标准委员会认为没有哪个类型对于所有的计算机平台都是最优选择。所以,标准委员会决定建立一个新的类型名(如,time_t),并让实现使用typedef来设置它的具体类型。以这样的方式,C标准提供以下通用原型:
time_t 在一个系统中是 unsigned long,在另一个系统中可以是 unsigned long long。只要包含time.h头文件,程序就能访问合适的定义,也可以在代码中声明time_t类型的变量。
typedef的一些特性与#define的功能重合。例如:
这使预处理器用BYTE替换unsigned char。但是也有#define没有的功能:
没有typedef关键字,编译器将把STRING识别为一个指向char的指针变量。有了typedef关键字,编译器则把STRING解释成一个类型的标识符,该类型是指向char的指针。因此:
但是,如果这样假设:
 
还可以把typedef用于结构:
然后便可使用COMPLEX类型代替complex结构来表示复数。使用typedef的第1个原因是:为经常出现的类型创建一个方便、易识别的类型名
用typedef来命名一个结构类型时,可以省略该结构的标签:
假设这样使用typedef定义的类型名:
 
这两个结构在声明时都没有标记,它们的成员完全相同(成员名及其类型都匹配),C认为这两个结构的类型相同,所以r1和r2间的赋值是有效操作。 使用typedef的第2个原因是:typedef常用于给复杂的类型命名。例如,下面的声明:
把FRPTC声明为一个函数类型,该函数返回一个指针,该指针指向内含5个char类型元素的数组。 使用typedef时要记住,typedef并没有创建任何新类型,它只是为某个已存在的类型增加了一个方便使用的标签。以前面的STRING为例,这意味着我们创建的STRING类型变量可以作为实参传递给以指向char指针作为形参的函数。 通过结构、联合和typedef,C提供了有效处理数据的工具和处理可移植数据的工具。
 
  • C
  • 枚举类型其他复杂的声明
    目录