宏定义与类型说明的区别和联系

一、类型说明

1、C语言不仅提供了丰富的数据类型给我们使用,而且还允许户自己定义说明符。在 C语言中,使用typedef即可完成这项功能,定义格式如下:typedef 原类型名 新类型名;
注意:typedef语句后面需要加上分号。

2、typedef语句并没有定义一种新的数据类型,它仅仅是给已有的数据类型取了一个更加简洁形象的名字,可以用这个新的类型名字来定义变量。在实际开发中,很多公司都会使用这个关键字来给变量类型取新名字,一是为了方便代码的移植,还有就是可以使代码更加的简洁易读。

3、有的时候也有用宏定义代替typedef的功能,但是宏定义是由预处理完成的,而typedef则是在编译时完成的,后者更加灵活。也许你曾看到过这种定义方式:#define uchar unsigned char
这种方式不建议大家使用,在这种应用下是没问题,但是当用到指针的时候,就有可能出错,在一些比较正规的公司如果写出这种形式,会让人觉得写代码的人比较初级。

二、宏定义

1、宏定义#define是预编译处理命令,在编译处理时进行简单的替换,不做任何正确性检查,不管含义是否正确都会被代入,例如:#define PI 3.1415926
定义了这个宏之后,我们今后可以直接用PI来替代3.1415926了,比如我们写程序area = PI×r×r来求圆的面积,就会直接替换成3.1415926×r×r。如果不小心写成了3.1415g26,编译的时候还是会代入到程序中进行替换。

三、typedef与#define的区别

1、typedef是在编译时进行处理的,它是在自己的作用域内给一个已经存在的类型起一个代号,如果我们把前边的类型说明错误的写成:typedef unsinged char uint8;
编译器就会直接在这里报错。

2、对于#define来说,更多的应用是进行一些程序可读性易维护的替换。比如:
#define LCD1602_DB P0
#define SYS_MCLK (11059200/12)

在写1602程序的过程中,我们可以直接用LCD1602_DB表示1602的通信总线,我们也可以直接用SYS_MCLK来作为我们单片机的机器周期,这样如果改动一些硬件,比如出于特定需要而换了其它频率的晶振,那么我们可以直接在程序最开始部分改一下即可,不用到处去查找修改数字了。

3、而对于类型说明,有的情况下typedef和#define用法一样,有的情况就不一样了。
(1)用法相同的情况举例:
typedef unsigned char uint8; uint8 i, j;
#defineuchar unsigned char uchar i, j;

这两种用法是完全相同的,没有区别,不过大家要注意typedef后边有分号,而#define后边是没有分号的。
(2)用法不同的情况举例:
typedef int int_p; int_p i, j;
#define int_p int
int_p i, j;**
这两种用法得到的结果是不一样的,其中第一种情况无疑是定义了i和j这两个int指针变量。
但是对于第二种情况,因为define是直接替换,实际上就是int* i, j; 所以i是一个int指针变量,而j却是一个普通的int变量。

4、总结:typedef是专门给类型重新起名的,而#define是纯粹替换的,需要辨别和记住用法。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值