请看正文
C语言中typedef与define有些功能有点类似,比如它们均可以给一个对象取个别名。因此也让许多初学者产生迷惑,分不清楚到底有什么区别,今天作者来总结一下供大家参考,看了本文相信大家能够掌握。
1、从功能上来说有不同
define指令用于宏定义,可以提高源代码的可读性,为编程提供方便,一般放在源文件的前面部分。
typedef用来定义自己习惯使用的数据类型名称,可以替代自己所熟悉的基本类型、数组类型、指针类型以及自己定义的结构体类型、共用体类型、枚举类型等。一旦我们在程序中使用typedef定义了自己的数据类型名称,我们就可以像使用int、float和double等基本数据类型一样来使用它。
2、从处理时机来说有不同
define是预处理指令,并不是编译过程中处理,而是在编译之前就已经完成了。它只是简单而机械的字符串替换,并不做正确性检测,若有错误,只能在编译这些已经展开的源程序时才能够被发现并报错。
typedef所定义的新名字具有一定的封装性,是在程序编译阶段处理的,编译时有类型检测功能。但它并不实际分配内存空间。
3、从具体用法来说有不同
define用于定义常量、变量、编译开关等。详细用法请见作者的另一篇文章,名为“C语言中的define预处理指令老手都是这样用,你全都掌握了吗?”,本文不再赘述。
typedef用于为不同数据类型定义新名字,详细用法请见作者的另一篇文章,名为“C语言中typedef用法总结,看完就能像编程老手一样熟练运用”,本文不再赘述。
4、从对指针的操作来说有不同
define和typedef两者都可以定义指针类型,但使用定义后的类型名去定义变量时,结果有差异。定义如下:
#define PCHAR1 char*
typedef char* PCHAR2;
(1)指针差异1,直接定义变量
举例说明如下:
PCHAR1 pc1, pc2;
PCHAR2 pc3, pc4;
上面两行语句目的是想把pc1、pc2、pc3、pc4都定义成指向char型数据的指针,结果pc2不符合定义成指针的预期,其实际为char型普通变量,其它三个为指针变量,符合预期。
为什么导致这个结果呢?原因很简单,define就是一个宏定义,在编译预处理阶段直接字符串替换,直接将PCHAR1替换成char*,替换后变成如下形式:
char * pc1, pc2;
很显然,pc1是指针变量,pc2为普通变量。
(2)指针差异2,与const修饰符连用。
举例说明如下:
char c1=‘A’;
char c2=‘B’;
char c3=‘C’;
const PCHAR1 pc5; //语句1
const PCHAR2 pc6=&c2; //语句2
语句1中,const限定的是指针变量pc5所指向空间的值,即空间的值不可被更改;但指针变量pc5的值可以更改,即其可以指向其它空间。
语句2中,const限定的是指针变量pc6的值,即pc6的值不可更改;但其所指向空间的值是可以更改的。通常在语句2中需要给pc6赋初值,否则编译时会有警告,提示所使用的pc6未初始化。
导致此差异的原因依然是define只是简单的字符串替换,语句1实际上是如下形式:
const char * pc5; //语句1
如果按照语句2形式的定义,想要用const限定空间的值,而不是限定指针,只需要重新定义PCHAR2即可,定义可修改为如下形式:
typedef const char* PCHAR2;
关于typedef与define的用法区别今天就总结到这,如果大家有任何疑问请留言探讨。我是“C语言知识传播者”,志在瞄准C语言,挖掘和总结C语言的难点和痛点,给C语言编程爱好者和本领域从业人员提供参考,我会用心总结C语言知识的点点滴滴,你的关注是我持续创作的动力,请关注我,收藏本文、转发并点赞,希望得到你们的持续关注,谢谢!
领取专属 10元无门槛券
私享最新 技术干货