学习
实践
活动
专区
工具
TVP
写文章

C语言中typedef与define的这些区别值得关注

请看正文

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语言知识的点点滴滴,你的关注是我持续创作的动力,请关注我,收藏本文、转发并点赞,希望得到你们的持续关注,谢谢!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200120A019MV00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券