当前位置: 首页 > news >正文

12.typedef的使用与结构体定义


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


文章目录

    • 1.基础介绍
    • 2.typedef 的常用的几种情况
    • 3.使用typedef可能出现的问题
    • 参考资料

1.基础介绍

typedef是C/C++语言中保留的关键字,用来定义一种数据类型的别名。

typedef并没有创建新的类型,只是指定了一个类型的别名而已。

typedef定义的类型的作用域只在该语句的作用域之内, 也就是说如果typedef定义在一个函数体内,那么它的作用域就是这个函数。如果typedef定义在一个命名空间中,则其作用域只在当前命名空间中。

使用 typedef 关键字可以用来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。

2.typedef 的常用的几种情况

  • 给基本数据类型定义别名
// 1
typedef doule REAL;
// 2
typedef float REAL;

定义数据类型REAL,在不同平台上通用的代码,如需改动,只需要修改typedef语句即可。

  • 为复杂类型定义别名,简化代码
typedef int *(*pFun)(int, int); // 定义函数指针int *add(int x, int y)
{int *p = new int;*p = x + y;return p;
}pFun fp[1]; // 定义函数指针数组
fp[0] = add;
std::cout << "r " << *fp[0](1,2) << std::endl;
  • typedef 与struct/enum/union等自定义数据类型共同使用

C语言中,对标签标识符强制了自己单独的命名空间,如自定义结构体时

struct Point {int x;int y;
};// 使用
struct Point p;

因在C语言中,Point定义在了struct命名空间中,使用时必须写成struct Point p,比较麻烦, 因此通常使用typedef给其起别名。

typedef struct Point_ {int x;int y;Point_(int a, int b) : x(a), y(b) {}} Point; 
// 使用
Point p;

在C++中已经不是必须的了struct定义的类型,可直接通过类型名使用。

3.使用typedef可能出现的问题

  • 1.歧义
typedef char* PCHAR;
int strcmp(const PCHAR,const PCHAR);

在这里,const PCHARconst char*不同,const PCHAR中指针是常量,const char*中,char是常量

// constant pointer to constant char
const char * const
// constant pointer to char
char * const
// pointer to constant char
const char *
  • 2.重复的存储类关键字

虽然 typedef 并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像 auto、extern、static 和 register 等关键字一样。因此,像下面这种声明方式是不可行的:

typedef static int INT_STATIC;

上面,statictypedef关键字重复了。


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


参考资料

  • 1.https://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c
  • 2.https://www.tutorialspoint.com/difference-between-const-char-p-char-const-p-and-const-char-const-p-in-c#:~:text=char*%20const%20says%20that%20the,cannot%20point%20to%20another%20char.
  • 3.http://c.biancheng.net/view/298.html
http://www.lryc.cn/news/32488.html

相关文章:

  • 宝塔+docker+jenkins部署vue项目(保姆级教程)
  • JVM面试总结
  • C语言——文件操作
  • 使用aim7测试内核性能变化
  • C++——内存管理
  • AOP的另类用法 (权限校验自定义注解)
  • [数据结构]:12-快速排序(顺序表指针实现形式)(C语言实现)
  • 运算符——“Python”
  • 2022 IoTDB Summit:华为王超《Apache IoTDB 在华为云的实践》
  • C 语言网络编程 — PF_NETLINK sockets
  • 广州银行冲刺A股上市:不良贷款规模突破100亿元,不良率飙升
  • 【C++】bsearch函数的使用及二分法查找介绍
  • 分布式系统中的补偿机制设计问题
  • 类成员的方法
  • 华为OD机试真题Python实现【端口合并】真题+解题思路+代码(20222023)
  • 自考本科计算机网络原理(04741)历年大题真题【18年10月-22年10月】
  • 计算机SCI期刊投稿,除了投稿信,还要做什么准备? - 易智编译EaseEditing
  • Allegro如何刷新封装和库里的封装同步操作指导
  • 基于Vue3手写选课组件(含时区切换,拖拽选择)
  • 准备好了吗?加入 GDE 成长计划,成为下一位谷歌开发者专家!
  • 搭建帮助中心的 8 个最佳工具
  • LQB小板焊接V3版本的小板原理图,PCB图,注意事项和步骤
  • 华为OD机试真题Python实现【翻转单词顺序】真题+解题思路+代码(20222023)
  • 微机原理和计算机组成原理复习
  • mysql5.7.33安装配置教程【保姆级安装教程】
  • 每天都和时间序列打交道,我总结了这篇文章!
  • 【Leetcode——重排链表】
  • HCIP总结(一)
  • 华为OD机试真题Python实现【黑板上色】真题+解题思路+代码(20222023)
  • C++中的利器——模板