• 说说 typedef 的那些事


    最近在复习数据结构时,经常看到 typedef 的身影,但始终不清楚 typedef 的用法具体时怎么样的,特地查阅《C Primer Plus 第5版》,并将查到的内容写出来供大家沟通学习。

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

    • 与 #define 不同,typedef 给出的符号名称仅限于对类型,而不是对值。
    • typedef 的解释由编译器,而不是由解释器执行。
    • 虽然它的范围有限,但在受限范围内,typedef 比 #define 更灵活。

    我们来看看 typedef 是怎样工作的。假设要对1字节的教值使用术语BYTE,您只须像定义一个char变量那样定义BYTE,然后在这个定义前面加上关健字 typedef,如:

    typedef unsigned char BYTE;

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

    BYTE x, y[10], *z;

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

    通常,这些定义使用大写字母,以提醒用户这个类型名称实际上是个符号缩写。不过,您也可以使用小写字母:

    typedef unsigned char byte;

    管理变量名的同样规则也用来管理 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 的原因之一是为经常出现的类型创建一个方便的、可识别的名称。例如,在前面的例子中,许多人都愿意使用 STRING 或与其等价的标记。

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

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

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

    rect r1 = {3.0, 6.0};
    rect r2;
    r2 = r1;

    这被翻译成:

     1 struct{
     2     double x;
     3     double y;
     4 }r1 = {3.0, 6.0};
     5 
     6 struct{
     7     double x;
     8     double y;
     9 }r2;
    10 r2 = r1;

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

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

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

    这把 FRPTC 声明为一个函数类型,该类型的函数返回一个指向含有5个元素的 char 数组的指针(请参见下面将要讨论的一些奇特的声明)。

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

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

    作者:耑新新,发布于  博客园

    转载请注明出处,欢迎邮件交流:zhuanxinxin@aliyun.com

  • 相关阅读:
    XPath 入门
    用jQuery为页面添加活力
    将xml中的数据导入到数据库
    web.config 电邮配置
    一、创建Cuisl.dll工程
    使用ASP.NET服务器控件
    VSTO install error 0x80131604
    javaScript 5
    CSS 基础
    创建第一个ASP.NET网站
  • 原文地址:https://www.cnblogs.com/Arthurian/p/8318961.html
Copyright © 2020-2023  润新知