问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

typedef的用法

发布网友 发布时间:2022-05-01 09:47

我来回答

4个回答

热心网友 时间:2023-10-03 03:20

在C语言的情况下,与C++稍有出入。typedef在结构体定义,还有一些数组等地方都大量的用到。归纳一下:   来源一:Using typedef to Curb Miscreant Code   Typedef 声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法。不管怎样,使用 typedef 能为代码带来意想不到的好处,通过本文你可以学习用 typedef 避免缺欠,从而使代码更健壮。   typedef 声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。本文下面将竭尽全力来揭示 typedef 强大功能以及如何避免一些常见的陷阱。   如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法?   使用 typedef 为现有类型创建同义字。   定义易于记忆的类型名   typedef 使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于 ''typedef'' 关键字右边。例如:   typedef int size;   此声明定义了一个 int 的同义字,名字为 size。注意 typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要 int 的上下文中使用 size:   void measure(size * psz);   size array[4];   size len = file.getlength();   std::vector<size> vs;   typedef 还可以掩饰复合类型,如指针和数组。例如,你不用象下面这样重复定义有 81 个字符元素的数组:   char line[81];   char text[81];   定义一个 typedef,每当要用到相同类型和大小的数组时,可以这样:   typedef char Line[81];   Line text, secondline;   getline(text);   同样,可以象下面这样隐藏指针语法:   typedef char * pstr;   int mystrcmp(pstr, pstr);   这里将带我们到达第一个 typedef 陷阱。标准函数 strcmp()有两个‘ const char *'类型的参数。因此,它可能会误导人们象下面这样声明 mystrcmp():   int mystrcmp(const pstr, const pstr);   用GNU的gcc和g++编译器,是会出现警告的,按照顺序,‘const pstr'被解释为‘char* const‘(一个指向 char 的常量指针),而不是‘char *'(指向char 的指针)。这个问题很容易解决:   typedef const cpstr;   int mystrcmp(cpstr, cpstr); // 现在是正确的   记住:不管什么时候,只要为指针声明 typedef,那么都要在最终的 typedef 名称中加一个 const,以使得该指针本身所指对象不会通过指针被修改。   链表中的大概应用   name 保存在结构体单元的name[20] 数组里;   typedef struct node   {   char name[20];   struct node *link;   }stu; 这是前面定义的结构体变量,一个单元包含两个部分,一个用来存储name的数组name[20],一个用来存放下一个单元地址的指向结构体node的指针。假设该单元的地址是p,那么p->name 表示第一部分name[20]的地址,p->link表示第二部分,作用是存放下一个单元的地址

热心网友 时间:2023-10-03 03:20

typedef的语法规则其实很简单,一句话来说就是定义对象的语法前加关键字typedef,剩下的不变,原本定义的对象标识符换成类型标识符,对应语义从定义一个对象改成定义一个类型别名。typedef看起来复杂根本原因是对象定义的语法比较复杂,例如分隔符*和[]的用法。
typedef struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode;
对应的对象定义:
struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode;
去除bintnode来看就是一个类型struct node的完整描述。加上了bintnode来看,表示定义了一个struct node类型的对象bintnode。
现在前面有typedef,因此这个bintnode不是对象名而是类型名。也就是定义了一个类型别名bitnode,实际上指的就是struct node这个完整类型。
typedef定义的类型别名在作用域内和被定义的原类型语义上等价,都是表示同一个类型的名称。这里typedef之后bitnode可以和struct node互相代替(注意在C++中,如果同一命名空间内类型名和对象名没有重复,那么struct可以省略,struct node等价于node)。
更复杂一点的:
struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode, *bintree;
注意定义对象时*修饰对象本身而不是修饰类型。因此这里定义了struct node对象bintnode和struct node*类型的对象bintree。
对应的类型定义:
struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode, *bintree;
这里定义了类型别名bintnode表示完整类型struct node,以及bintree表示类型struct node*。
拆开来就成了
typedef struct node{
datatype data;
struct node *lchild,*rchild;
}bintnode;

typedef bintnode *bintree;
这种写法看起来应该稍微清楚了一点。
至于下面的cirqueue,和上面的bintnode类似,只是这里省略了结构体名称,是一个匿名类型。这样写的主要好处是类型名可以省略struct(C++里面不这样写也可以省略)。
====
[原创回答团]

热心网友 时间:2023-10-03 03:20

就是将语言已定义的类型起一个对自己有意义的别名。例如:

typedef unsigned int uint; //这样以后写起来方便,可以uint uTemp;就等于unsigned int uTemp;

如果觉得好,请把我设为最佳答案。谢谢。

热心网友 时间:2023-10-03 03:21

将系统定义或自定义类型取别名,想了解详细建议你百度一下“typedef”!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
交通事故致人死亡,该如何处理? 爱普生LQ1600KIIIH 断色带 爱普生针式打印机LQ1600KⅢH近两月来总频繁中断打印,同时电脑显示是通讯... ACQUA DI PARMA 帕尔玛之水 蓝色地中海系列 桃金娘加州桂中性淡香水 E... 女士香水推荐-ACQUA DI PARMA 帕尔玛之水 优雅木兰女士浓香水 EDP 50... ACQUA DI PARMA帕尔玛之水克罗尼亚系列中性香水套装-适用对象 帕尔玛 | 必须拥有的小众沙龙香 ACQUA DI PARMA/帕尔玛之水克罗尼亚系列黑调男士古龙水-适用对象 ACQUA DI PARMA 帕尔玛之水 克罗尼亚系列 风度中性古龙水 EDC 20ml... ACQUA DI PARMA/帕尔玛之水-绅士男士古龙水EDC qq情侣空间纪念日生日名称是0怎么改 如何用zlib解压gzip数据 有如下代码: 2.#include &lt;string&gt; 和#include &lt;cstring&gt; vivo颜色反转能设置快捷方式吗 氧化锆陶瓷的种类特点 QQ宝贝、Q宠企鹅怎么卸载? 怎么把Q宠企鹅那个流氓软件删掉? 什么是全稳定氧化锆 拷贝构造函数、构造函数和赋值语句的区别 我的电脑被别人安装了Q宠企鹅我想卸载它可我连QQ都卸载了还是没把它卸载下去求指点啊 PSZ是什么 PSZ是什么意思 Q宠企鹅怎么删除电脑程序 常见一些变量名前缀加上psz什么意思?比如char*pszBuffer,这是什么意思? 我不知到怎么卸载q宠企鹅,试着在它图标上点击右键用360损粹其文件能达到卸载的目的吗? 桌面上的q宠企鹅没了怎样卸载 怎样卸载q宠企鹅 请问Q宠企鹅这款软件怎么卸载? 如何完全卸载“q宠企鹅”程序! 情侣空间的纪念日名称可以改吗 我不小心把我男票的生日名称填成了“0生日” 变得和我生日名称一样 100财富给牛*之人!就没人知道在linux下用c语言如何将汉字的unicode编码转化为汉字吗? typedef struct {...}*Pstr; 这个指针是什么意思? 高级经济师业务能力电子化考试有什么样 成为一名高级经济师需要哪些 电脑如何装双系统,D盘如何改成系统盘 我的系统在D盘中 可C是默认的系统盘 如何将D盘改为系统盘啊? 什么是pcb电路图 找一款最简单的手机日历,只要能查看日期的就行了,不需要其它功能的。 请问PCB在电子行业中到底代表什么? 电路设计和画电路板不是一回事吗 请问下各位大侠,电路板与PCB板有什么区别,我想日后能学会修理电路板我应该进什么样的公司和从事什么岗位 我们每天在手机上看到的日历是什么历 电子工程师和pcb设计工程师一样么 高频PCB到底能算哪种电路板?是印刷的吗? 电压力锅不停的喷气怎么回事 为什么美的电压力锅做饭一直喷气 电压力锅做米饭时限压阀一直喷气,购买了一个月今天才有这种现象? 半球的电压力锅加热到最后一直向外喷气,怎么回事? 高压锅不是滋滋的间歇喷气怎么回事