在C还是C++代码中,typedef都使用的很多,在C代码中尤其是多。typedef与#define有些相似,其实是不同的,特别是在一些复杂的用法上,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我不加修改的引用过来了,加上自己的一个分析。

  基本定义:

  typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

  用途一:与#define的区别

  typedef 行为有点像 #define 宏,用其实际类型替代同义字。不同点是 typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。

  用途二:减少错误

  定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:

char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,
// 和一个字符变量;

  以下则可行:

typedef char* PCHAR;
PCHAR pa, pb;

  这种用法很有用,特别是char* pa,pb的定义,初学者往往认为是定义了两个字符型指针,其实不是,而用typedef char* PCHAR不会出现这样的问题,减少了错误的发生。

  用途三:直观简洁

  用在旧的C代码中,帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名对象名,如:

struct tagPOINT1
 {
    int x;
    int y;
};
struct tagPOINT1 p1;

  而在C++中,则可以直接写:结构名对象名,即:tagPOINT1 p1;

typedef struct tagPOINT
{
    int x;
    int y;
}POINT;

  POINT p1; // 这样比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候,或许,在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。

  用途四:平台无关性

  用typedef来定义与平台无关的类型。

  typedef 有另外一个重要的用途,那是定义机器无关的类型,例如,你可以定义一个叫 REAL 的浮点类型,在目标机器上它可以获得高的精度:

  typedef long double REAL;

  在不支持 long double 的机器上,该 typedef 看起来会是下面这样:

  typedef double REAL;

  并且,在连 double 都不支持的机器上,该 typedef 看起来会是这样:

  typedef float REAL;

  也是说,当跨平台时,只要改下 typedef 本身行,不用对其他源码做任何修改。

  标准库广泛使用了这个技巧,比如size_t。另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健。