http://blog.sina.com.cn/s/blog_5e8facd20100qfpn.html
http://www.cnblogs.com/kerwinshaw/archive/2009/02/02/1382428.html
typedef作为类型定义关键字,用于在原有数据类型(包括基本类型、构造类型和指针等)的基础上,由用户自定义新的类型名称。
将INT32定义为与int具有相同意义的名字,这样类型INT32就可用于类型声明和类型转换了,它和类型int完全相同。比如:
既然已经有了int这个名称,为什么还要再取一个名称呢?主要是为了提高程序的可移植性。比如,某种微处理器的int为16位,long为32位。如果要将该程序移植到另一种体系结构的微处理器,假设编译器的int为32位,long为64位,而只有short才是16位的,因此必须将程序中的int全部替换为short,long全部替换为int,如此这样修改势必工作量巨大且容易出错。如果将它取一个新的名称,然后在程序中全部用新取的名称,那么要移植的工作仅仅只是修改定义这些新名称即可。也就是说,只需要将以前的:
替换成:
由此可见,typedef声明并没有创建一个新类型,而是为某个已经存在的类型增加一个新的名字而已。用这种方式声明的变量与通过声明方式声明的变量具有完全相同的属性。
至于typedef如何简化复杂的类型声明,将在后续的章节中详细阐述。
综上所述,如果在变量定义的前面加上typedef,即可定义该变量的类型。比如:
那么,size就成为了上面的size变量的类型,即int类型。既然size是一个类型,当然可以用它来定义另外一个变量。即:
所以pch2为char型变量。如果用typedef来定义的话,其代码如下:
则“ptr_to_char pch1, pch2”等价于
因此,pch1、pch2都是指针。
typedef的四个用途和两个陷阱
用途一:
定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:
char*
//
以下则可行:
typedef
PCHAR
虽然:
char
也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。
用途二:
用在旧的C代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为:
struct
{
};
struct
而在C++中,则可以直接写:结构名
tagPOINT1
估计某人觉得经常多写一个struct太麻烦了,于是就发明了:
typedef
{
}POINT;
POINT
或许,在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。
用途三:
用typedef来定义与平台无关的类型。
比如定义一个叫
typedef
在不支持
typedef
在连
typedef
也就是说,当跨平台时,只要改下
标准库就广泛使用了这个技巧,比如size_t。
另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健(虽然用宏有时也可以完成以上的用途)。
用途四:
为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。举例:
1.
变量名为a,直接用一个新别名pFun替换a就可以了:
typedef
原声明的最简化版:
pFun
2.
变量名为b,先替换右边部分括号里的,pFunParam为别名一:
typedef
再替换左边的变量b,pFunx为别名二:
typedef
原声明的最简化版:
pFunx
3.
变量名为e,先替换左边部分,pFuny为别名一:
typedef
再替换右边的变量e,pFunParamy为别名二
typedef
原声明的最简化版:
pFunParamy
枚举:
枚举变量中的枚举元素系统是按照常量来处理的,故叫枚举常量,他们是不能进行普通的算术赋值的,(pencil=1;)这样的写发是错误的,但是你可以在声明的时候进行赋值操作!
enum
enum box{pencil=3,pen};//这里pen就是4系统将自动进行pen=4的定义赋值操作!
前面说了那么多,下面给出一个完整的例子大家可以通过以下的代码的学习进行更完整的学习!
#include <<span style="color: maroon;">iostream>
using
void
{
}
enum
{
kUIAction_Simple_Section =
kUIAction_OKCancel_Section,
kUIAction_Custom_Section,
kUIAlert_Simple_Section,
};
typedef
} UIButtonType;
http://www.tuicool.com/articles/MZbEjm
1、C++定义的结构名、联合名、枚举名 都是 类型名,可以直接用于变量的声明或定义。即在C++中定义变量时不必在结构名、联合名、枚举名 前加上前缀struct、union、enum。
例如有如下头文件(head.h)
//head.h enum color {red,blak,white,blue,yellow}; struct student {char name[6]; int age; int num;}; union score {int i_sc; float f_sc;};
在C中使用的使用的方法
#include "head.h" int main(void) { enum color en_col; struct student st_stu; union score un_sc; //.... return 0; }
在C++中使用的使用的方法
#include "head.h" int main(void) { color en_col; student st_stu; score un_sc; //.... return 0; }
在C语言中定义这3种变量显得很麻烦,在C中通常使用typedef来达到和C++一样的效果
//example.c typedef enum _color {red,blak,white,blue,yellow}color; typedef struct _student {char name[6]; int age; int num;}student; typedef union _score {int i_sc; float f_sc;} score; int main(void) { color en_col; student st_stu; score un_sc; //.... return 0; }