参考: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)创造平台无关类型,便于移植【写不同的平台时定义相同别名】