typedef和define区别(通俗)
总结:typedef和define可对⼀个对象进⾏ 取别名(typedef) 或 字符替换(define) ,以此增强程序的可读性
typedeff是关键字,对已经存在的数据类型取别名。
在编译阶段处理,会进⾏类型检查,只能在定义的作⽤域内使⽤。
define是预处理指令(宏定义),只进⾏简单的字符替换,是否产⽣错误要在编译时才可知。
没有作⽤域限制,可以对类型/变量/常量等进⾏替换
与const组合区别:
typedef char* pstr;
“const pstr”会被解释为“char*const”:不能更改指向的地址(常量指针)
如果是define则会被解读为const char*:指针指向⼀个常量,可以更改指向的地址。
1、typedef:它在⾃⼰的作⽤域内给⼀个已经存在的类型⼀个别名。它是在是在编译时处理的。
int main()
{
typedef int size;
size a=3;//等同于int a =3;
fun();
}
int fun()
{
size a=3;//报错
}
2、#define 是预处理指令。在编译预处理时进⾏简单的替换
tips:⼀个程序的运⾏过程,⼤致可分为:预处理->编译->程序执⾏。(链接与本知识⽆关,且不讨论)
(1)预处理:执⾏预处理指令,进⾏简单的替换(替换后删除预处理指令)。
#define a 3
int main()
{
printf("%d",a);
return0;
}
字符替换后其实等同于
int main()
{
printf("%d",3);
return0;
}
const的作用注意此时程序还远远没有执⾏,只是编译器在执⾏预处理(⽐如我们⽤记事本写东西,假设可以发送,那么记事本先改正拼写,然后再提交给别⼈,记事本⾃我改正拼写的功能就是预处理)
显⽽易见,预处理仅是进⾏简单的字符替换,不作正确性检查,不管含义是否正确,也没有数据类型⼀说。
当要替换的字符和定义的变量同名时就会产⽣定义冲突,如下:
#define a 3
int main()
{
int a=5;
printf("%d",a);
return0;
}
(2)编译:进⾏程序的语法检查,检查⽆错程序再执⾏,否则直接报错。
平时我们程序运⾏直接出错,实际就是编译检查出语法错误,如上的定义冲突错误。程序还没到执⾏的那⼀步。
所以define宏替换,可能带来的错误只有在编译时才可能发现并报错。
由上可知,define只是程序执⾏前的字符替换⽽已,不牵扯程序本⾝语法或者执⾏,因此想替换谁替换谁,也没有作⽤域⼀说,⾄于错误,那是编译时候检查的事情了(单纯字符替换对程序运⾏是缺点,可能造成各种错误)。
(3)运⾏时,可能产⽣的问题
#define X int*
typedef int* Y
X p1, p2;
等同于int*p1,p2;//⼀个指针变量,⼀个整形变量
Y p1,p2;//两个都是指针变量
//int* 可以是⼀个类型,显然define把int当做类型,更印证的宏替换没有数据类型。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论