重命名关键字—typedef

  • 一.typedef应该是typerename
  • 二.typedef的具体使用

一.typedef应该是typerename

为什么这样说呢?因为typedf其实就是一个重命名关键字,看示例

这里我觉得unsigned int太长了,我将它改名为u_int,这样在书写过程中更方便

下面来看一些奇怪的例子

这里看起来有些奇怪,但抓住本质。int*是原本的类型,而int_p是我对它的重命名

看一看对结构体的重命名

这是我们原本的结构体使用,stu_t是该结构体的一个全局变量,struct stu x是该结构体的临时变量(如果不怎么了解结构体的可以看看这篇博客 什么是结构体)

如果我们对其重命名后,stu_t就不再是全局变量了,而是struct stu重命名后的名字,这样写更加方便

对数组的重命名

这是我们平常定义一个叫a的数组

可以看到,一旦我们加上typedef,那么a就不再代表数组名了,更应该称为一种类型,就相当于用现在的a代替(当然并非简单的替换,这里只是方便理解)原来的int [10],从监视中也可以看到,用a定以b,b就变成了一个大小为10的整形数组

总结一下:typedef就是对类型进行重命名的解决方案。它存在的意义就是帮助我们从冗长的类型命名里解放出来。一般使用它对我们一些不太好理解的类型进行简化

ps:typedef虽然好用但别过的使用,因为这毫无疑问会给我们带来阅读成本,例如一个数组用a来代替,那么a b,阅读者根本不知道它数组的具体类型和元素个数。建议一般在使用结构体时使用

二.typedef的具体使用

可以看到a是int*类型而b是int类型,这是因为a离得更近。具体为什么就是系统的规定

那其实我们也可以这样写,但不推荐,可读性太差。接下来回归正题

从上可以看到a,b两个都是指针类型了。所以可以看出使用typedef并不是简单的替换,更应该理解成一种全新的类型,像是int_p因为它没有*号,所以不存在跟谁结合的问题。它对其后的所有变量都赋予该类型

接下来看看#define的区别

区别一

看以上的代码,能否通过呢?a,b,c的类型又是什么呢?

可以看到这样写和我们直接int*a,b,c的结果是一样的,为什么呢?

这里需要和typedef区分开来,tydefy本质上是重命名而不是文本替换,它相当于形成了一个新的类型,即使它有时使用起来和直接写没区别。而宏定义进行的是文本替换,换句话说编译器第一步进行预处理时,会直接将我们的int*替换至ptr_t处,于是可以回答上面的问题,既然是等价替换,那么结果当然相同啦

区别二

这样写是可以编过的,那下面呢?

这里很明显的看到65报错而64行却没报错。这里也很好理解,前文说到宏是进行文本替换,所以这里INT32就直接被替换为了int,前面再加个unsigned当然没问题。而前文也说到typedef所修饰类型是一个独立的类型,编译器就会认为这是int32类型而不是int类型,即使它们的作用相同,因此你当然不能加一个unsiged,编译器会感到疑惑,unsiged int32是什么类型。

结论:1.宏在类型处理时秉承着类型替换的原则而typedef秉承着文本重命名的原则。并且typedef所修饰的类型后不能加其他关键字组成新的类型(即使它们原本可以)

重命名关键字—typedef相关推荐

  1. 【C】define宏展开 typedef类型重命名

    1.define define宏展开是在预编译过程进行替换. #include<stdio.h> #include<typeinfo> using namespace std; ...

  2. 文件名和文件夹的bat批量重命名替换关键字和删除关键字

    文件名和文件夹的bat批量重命名替换关键字和删除关键字 批量文件名关键字替换 @echo off set "str1=需要替换的关键字" set "str2=替换后的关键 ...

  3. python中一共有多少个关键字-Python 为什么会有命名关键字参数?

    题主会有这样的疑问是因为对Python函数的参数还了解不多.位置参数也不一定是必传的,事实上在下面你会看到参数是否必传(也就是有无默认值)与它是位置的还是关键字的根本无关.下文黄底图片的例子能充分为你 ...

  4. Oracle学习:表的创建、修改、重命名、删除、闪回

    一.表的创建 通过已有表创建表(保留其中的数据.不保留其中的数据,保留部分数据) (1)创建前提条件: 表空间的使用权限 create table 的权限 (2)表名的注意事项: 以字母开头 长度不能 ...

  5. Oracle表字段的增删改和重命名

    增加字段语法:alter table tablename add (column datatype [default value][null/not null],-.); 说明:alter table ...

  6. 如何将图片一键重命名按顺序_如何“智慧”地管理文件?(一次付出,终身受益)...

    1.阅读本文预计需要 8 分钟,并提供了资源下载. 2.本文是「电脑爱好者」专题C15篇的首次发布. 3.第一时间获取更新,欢迎关注「奔跑中的奶酪」. 导读 网上很少有对海量文件管理进行理论和实践说明 ...

  7. 熊猫分发_熊猫重命名列和索引

    熊猫分发 Sometimes we want to rename columns and indexes in the Pandas DataFrame object. We can use pand ...

  8. 【批量识别图片内容改名】如何批量识别图片中的文字并自动改名,如何根据图片上的文字内容重命名图片,批量的识别区域内容如何重命名改名,全部告诉你

    废话: 在工作和生活和学习工作中我们经常遇到大量的图片需要进行根据图片内容来重命名图片 有的是扫描全部图片内容进行重命名,文字必须是少量的255个字 有的是需要获取图片指定位置的图片内容进行重命名,多 ...

  9. C语言:重命名文件(rename()函数)

    程序: #include <stdio.h> #include <dirent.h> #include <string.h>typedef unsigned cha ...

最新文章

  1. NEERC 17 G.The Great Wall
  2. 机器学习java_如何开始使用Java机器学习
  3. L1-046 整除光棍 (20 分)567
  4. iOS实现书架布局样式【一些电子书的首页】
  5. Quartz学习总结(1)——Spring集成Quartz框架
  6. Wilcoxon符号秩检验及其matlab代码
  7. 解决AndroidStudio Locat侧边栏消失
  8. 深拷⻉浅拷⻉的区别?如何实现⼀个深拷⻉?
  9. 赵小楼《天道》《遥远的救世主》深度解析(56)芮小丹的“精神绝症”和“心之地狱”
  10. Go语言使用golang-jwt/jwt/v4进行JWT鉴权
  11. biopython 【1】简单介绍【常用板块、安装】
  12. HNOI2005 狡猾的商人
  13. 5G取代光纤宽带,有可能吗?
  14. dhu oj 题目列表
  15. Vue 人资 实战篇七 员工管理上 封装通用的组件、formatter属性、过滤器的使用、树形结构、建立公共导入的页面路由、excel的导入和导出、
  16. 为什么“1000000000000000 in range(1000000000000001)”在 Python 3 中如此之快?
  17. 20200524 碎碎念
  18. 通达信macd底背驰代码
  19. 朱嘉明:区块链对深入改革的意义何在?
  20. 必须培养通才型专家团队

热门文章

  1. 13.6.2 定制邀请函,保存为 Word 文档
  2. 03-树1 树的同构 判断树是否同构的略简单方法
  3. spring 配置项 qualifier小解
  4. 用python绘制生日蛋糕_使用HTML5和CSS3实现生日蛋糕的制作
  5. 汇编学习笔记1 通用寄存器和段寄存器详解
  6. linux按键驱动设计(V3S开发板)
  7. spring boot 集成 redis spring-boot-starter-data-redis 2.1.7.RELEASE jedis: pool: #连接池配置 及踩坑经验
  8. selenium鼠标点击
  9. 图神经网络用于推荐系统问题(PinSage,EGES,SR-GNN)
  10. 新年快乐——2015年春节点滴