#define
用于指定标识符来代替一个字符串、表达式或数值常量,也称为宏定义。标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”都用宏定义中的对象(字符串、表达式、数值常量)去替换,称为宏展开或宏替换。
宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。生命周期止于编译期。
typedef
typedef 的主要应用有如下的几种形式:
1) 为基本数据类型定义新的类型名。
2) 为自定义数据类型(结构体、公用体和枚举类型)定义简洁的类型名称。
3) 为数组定义简洁的类型名称。
4) 为指针定义简洁的名称。
此种应用的主要目的,首先是丰富数据类型中包含的属性信息,其次是为了系统移植的需要。
两者的区别:
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不管含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如: #define PI 3.1415926 程序中的:area=PI*r*r 会替换为3.1415926*r*r 如果你把#define语句中的数字9 写成字母g 预处理也照样带入。
2) typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名,但是You cannot use the typedef specifier inside a function definition。
3) typedef int * int_ptr与 #define int_ptr int * 作用都是用int_ptr代表 int * ,但是二者不同,正如前面所说 ,#define在预处理 时进行简单的替换,而typedef不是简单替换 ,而是采用如同定义变量的方法那样来声明一种类型。