• C/C++ 中typedef 关键字的使用 (给类型起别名)


    目录

    typedef的介绍

    • 作用时间:在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。

    • 功能:用来定义类型的别名

    • 作用域:类似于定义变量的类型一样,若在main函数前,则相当于全局变量的作用域,若在函数中,则只在所在函数中作用。


    typedef的使用场景

    • 定义机器无关的类型,有利于程序的通用与移植。

      对已经存在的类型增加一个类型名,而没有创造新的类型。有时程序会依赖于硬件特性**。** ​

      typedef long double REAL;//在目标机器上它可以i获得最高的精度
      typedef double REAL;//在不支持 long double 的机器上
      typedef float REAL; //在连 double 都不支持的机器上
      
      
      • 1
      • 2
      • 3
      • 4
    • 创建易于记忆的类型名

      typedef int size   //此声明定义了一个 int 的同义字,名字为 size
      
      • 1
    • 掩饰复合类型

      typedef char Line[81]; //定义一个 typedef 的意思就是给 81 个字符元素的数组,起了一个昵称Line
      
      • 1

    typedef的使用陷阱

    • typedef声明指针
    typedef char * pstr; 
    
    const pstr   //被编译器解释为char * const(一个指向 char 的常量指针),而不是const char *(指向常量 char 的指针)
    
    • 1
    • 2
    • 3
    • typedef不能与其他存储类关键字共用
    typedef register int FAST_COUNTER; // 错误编译通不过
    
    • 1

    typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性。问题出在你不能在声明中有多个存储类关键字。因为符号 typedef 已经占据了存储类关键字的位置,在 typedef 声明中不能用 register(或任何其它存储类关键字)。

    “建立一个类型别名的方法很简单,在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头”。


    typedef的使用示例

    int* (a[5])(int, char);
    typedef int* (PF)(int, char);//PF是一个类型别名【注2】。
    PF a[5];//跟int* (a[5])(int, char);的效果一样!
    //首先看到标识符名a,“[]”优先级大于“*”,a与“[5]”先结合。所以a是一个数组,这个数组有5个元素,每一个元素都是一个指针。
    
    • 1
    • 2
    • 3
    • 4
    
    void (b[10])(void ()());
    typedef void (*pfv)();
    typedef void (*pf_taking_pfv)(pfv);
    pf_taking_pfv b[10]; //跟void (b[10]) (void ()());的效果一样!
    //b是一个数组,这个数组有10个元素,每一个元素都是一个指针,指针指向一个函数,函数参数是“void (*)()”,返回值是“void”。完毕!
    //这个参数又是一个指针,指向一个函数,函数参数为空,返回值是“void”。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    typedef struct name_t{ 
    int x;
    
    int y;
    
    }name_s,*name_fp;
    
    //name_s结构体类型,name_fp结构体指针类型
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    记录学习--分页时会查两遍数据库吗
    excel表格怎么求和一行
    Ubuntu 23.10/24.04 LTS 放弃默认使用 snap 版 CUPS 打印堆栈
    Linux下安装Mysql5.7,超详细完整教程,以及云mysql连接
    创新案例|实现YouTube超速增长的3大敏捷组织运营机制(上)
    .NET使用原生方法实现文件压缩和解压
    stream流相关操作
    告别互信息:跨模态人员重新识别的变分蒸馏
    毕业设计注意事项(2024届更新中)
    有更新:2023华为HCIA+HCIP最全Datacom题库解析(附全套文档赠送)
  • 原文地址:https://blog.csdn.net/qq_21438461/article/details/126194691