参考:http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.html

   https://wenda.so.com/q/1471668835727989?src=9999&cid-pre=1000204

typedef在简单的别名用法中经常用来和#define比较。

以下参考《C语言内核解析》3.9.5小节及4.6节

#define与typedef都可以用来给现有类型起别名。#define只是简单宏替换,在预编译时被处理。typedef不是简单替换,它具有语义分析,是一种存储类的关键字,用来为复杂的声明定义简单的别名。

 

简单应用中的区别

#define和typedef写法的区别在于:#define原型在后,别名在前  typedef原型在前,别名在后

区别一:#define简单替换,typedef不是

#define dpchar char *;

typedef char * tpchar;

dpchar p1,p2;    //只是简单的替换,等价于 char *p1,p2;只有p1才是指针变量

tpchar p1,p2;    //不是简单的替换,等价于 char *p1,p2;p1,p2都是指针变量

区别二:#define可实现类型组合,typedef不行

#define dint int;

typedef int tint;

 

unsigned dint p1,p2;  //正确,等价于unsigned int p1,p2

unsigned tint p1,p2;  //不可以

区别三:typedef可以组建新类型,但是#define不行

typedef char[200] charBuf;

charBuf buf;      //等价于char buf[200],但是#define不行

 

typedef的复杂用法

数据结构组合

typedef char Line[81]  Line类型代表具有81个元素的字符数组。Line t 就等同于char t[81]。参考https://wenda.so.com/q/1471668835727989?src=9999&cid-pre=1000204

函数指针

typedef  int  (*fun_ptr)(int,int);  //typedef行

int     (*fp)(int,int);        //原型行

fun_ptr   fp;            //应用行

“typedef行”和“原型行”相比,“typedef行”仅仅多个typedef,根本区别在于,fun_ptr是类的别名,fp是该类的变量。“原型行”和“应用行”的编译结果是一样的。他们都是创建了一个类型为int(*)(int,int)的函数指针fp。只是应用行比原型行这种形式更加简洁,便于书写和理解。

形式越复杂,typedef的优势就越明显。

typedef和struct

 typedef和struct组合是常见用法

C语言中struct普通用法:struct node n;

配合typedef:

1、利用结构体类型申请变量时就可以省略掉struct这个关键字。

typedef struct node  //给struct node{ }类型取别名

{

}Node;

Node  n;     //利用结构体类型申请变量

2、使用typedef一次定义两个类型,分别是结构体类型和结构体指针类型

typedef struct node

{

} Node,*pNode;

其中Node为结构体类型,pNode是结构体指针类型。

typedef与const

1、typedef int *PINT;

   const PINT p2;

相当于是int *const p2;

2、typedef int *PINT;

   PINT const p2;

相当于是int *const p2;

3、const int *p写成

  typedef const int *CPINT;

  CPINT p;

 

使用typedef的两个重要意义:(1)简化类型,让程序更易理解和书写。 (2)创造平台无关类型,便于移植【写不同的平台时定义相同别名】