Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192080
  • 博文数量: 40
  • 博客积分: 2265
  • 博客等级: 大尉
  • 技术积分: 434
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-23 17:01
文章分类

全部博文(40)

文章存档

2014年(1)

2013年(2)

2012年(6)

2011年(5)

2010年(26)

我的朋友

分类: C/C++

2010-10-13 10:35:41

    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 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);   这是错误的,按照顺序,‘const pstr'被解释为‘char * const'(一个指向 char 的常量指针),而不是‘const char *'(指向常量 char 的指针)。这个问题很容易解决:   
typedef const char * cpstr;   
int mystrcmp(cpstr, cpstr); // 现在是正确的   
记住:不管什么时候,只要为指针声明 typedef,那么都要在最终的 typedef 名称中加一个 const,以使得该指针本身是常量,而不是对象。

    typedef的代码简化:
    上面讨论的 typedef 行为有点像 #define 宏,用其实际类型替代同义字。
不同点是 typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。
例如:   typedef int (*PF) (const char *, const char *);   这个声明引入了 PF 类型作为函数指针的同义字,该函数有两个 const char * 类型的参数以及一个 int 类型的返回值。如果要使用下列形式的函数声明,那么上述这个 typedef 是不可或缺的:   PF Register(PF pf);   Register() 的参数是一个 PF 类型的回调函数,返回某个函数的地址,其署名与先前注册的名字相同。
下面我展示一下如果不用 typedef,我们是如何实现这个声明的:   
int (*Register (int (*pf)(const char *, const char *)))
(const char *, const char *);

以上内容来自百度百科。
关于typedef代码简化的问题,再举个例子:
信号处理函数signal在系统头文件signal.h中是如何声明的呢?
首先来看该函数的原型,void(*signal(int,void(*)(int)))(int);
这样的代码如果不简化还真是让人头疼的事情,使用typedef则可以轻易的分析出:
type void (*HANDLER)(int);
HANDLER signal(int,HANDLER);
signal()函数的返回值指向一个参数为整型,返回值为void类型的函数的指针。果然简单多了!
   

阅读(650) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~