共性:都是起别名
区别:
原理不同
#define是预处理指令,在预处理时进行简单机械的字符串替换,不做正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错
typedef是关键字,编译时处理,由类型检查功能。。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。
作用域不同
#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。
typedef有自己的作用域。在所有函数外,作用域为从它定义开始直到文件尾;在函数内,作用域为从定义开始直到该函数尾。
注意
1.与#define不同,typedef创建的符号名只受限于类型,不能用于值
2.typedef由编译器解释,而不是预处理器;#define预处理器处理
3.在其受限范围内,typedef比#define更灵活
总结
typedef只能给类型起别名,#define可以给类型也可以给数字起别名。使用时,一般用#define为数字起别名,用typedef为类型起别名。
如果使用#define为类型起别名,不能连续定义变量(#define只替换原来的位置 )
cs
#define ElemType char*
ElemType a,b;//#define不能连续定义两个变量
//相当于char*a;char b;