在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
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++里面不这样写也可以省略)。
====
[原创回答团]
就是将语言已定义的类型起一个对自己有意义的别名。例如:
typedef unsigned int uint; //这样以后写起来方便,可以uint uTemp;就等于unsigned int uTemp;
如果觉得好,请把我设为最佳答案。谢谢。
将系统定义或自定义类型取别名,想了解详细建议你百度一下“typedef”!