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类型的函数的指针。果然简单多了!
阅读(676) | 评论(0) | 转发(0) |