typedef和define的区别有:define是预处理编辑器,可定义宏存在被替换的的可能性而typedef是由编辑器处理的,并且遵循范围规则,可用作定义类型别名
#define是一个C指令,它也是用于定义类似于typedef的各种数据类型的别名。但是它们之间仍存在差别,接下来在文章中具体为大家介绍它们之间的区别,具有一定的参考作用,希望对大家有所帮助
【推荐课程:C语言教程】
1、预处理器VS编译器
立即学习“C语言免费学习笔记(深入)”;
#define由预处理器处理的,它将#define值从定义点复制粘贴到使用点。而typedef是由编译器处理的,并且是新类型的实际定义。在控制将到达编译器时,所有#define都将被替换。
差异的影响
(1)typedef要以分号结束而#define不以分号结束
(2)#define中可能存在替换的副作用,例如:
typedef char * string_t; #define string_d char * string_t s1,s2; // s1和s2都是char *类型 string_d s3,s4; // s3是char *但是s4的类型是char(而不是char *)
第二个声明中的问题是因为预处理器会将其替换为
char * s3,s4;
这意味着s3是char *类型,但s4将是char类型。如果想要所有的变量都成为指针类型就所有变量必须指定*
(3)typedef遵循范围规则。即在范围内(函数内)定义了新类型,则只有范围存在时才会显示新类型名称。但是当预处理器遇#define时,它将替换所有出现的事件(之后没有范围规则)。例如:
int main (){ { //新范围开始 typedef int myInt_t; #define myInt_d int myInt_t a; // a的类型为int myInt_d b; // b的类型为int } //新范围结束 myInt_t c; //错误,输入myInt_t未找到 myInt_d d; //d的类型为int }
2、宏VS类型别名
#define也可用于定义宏,但是typedef只能用于为现有类型提供新名称(它不能创建新类型)。类似地,#define可以用来定义变量
#define N 10
实际上是不会定义N,但是会在整个代码中将N替换为10。所以可以用于命名常量。而typedef只能为已定义的类型提供新名称
3、将typedef作为类型别名
某些类型定义只能使用typedef定义,而不能使用#define定义。例:
(1)给大小为10的整数数组赋一个新名称
typedef int arr [ 10 ] ;
(2)为结构类型赋予新名称
typedef struct { int a; char b; } myType;
总结:以上就是本篇文章的全部内容了,希望对大家有所帮助。