宏定义基础知识

#define 叫做 宏定义命令,它是C语言预处理命令的一种。所谓宏定义,就是用一个标识符来表示一个字符串,如果在后面的代码中出现了该标识符,那么就全部原样替换成指定的字符串。
宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单粗暴的替换。字符串中可以含任何字符,它可以是常数、表达式、if 语句、函数等,预处理程序对它不作任何检查,如有错误,只能在编译已被宏展开后的源程序时发现。


合法标识符都可以用来做宏名,但业内的使用习惯是宏名字母要全大写。因为全部字母都大写不能使用驼峰命名法所以在显式标识符的分域或分词时要用下划线来隔开。

#define BUF_SIZE                    (128)
#define ENET_IRQ_NUM                (150)

宏定义一个常数,能提高代码可读性,也能方便对常数的修改,尤其是同一个常数被多处使用时。如下例所示,用 PI 来定义 3.1415926,在计算圆的面积和周长时都会将 PI 替换为 3.1415926 来进行计算。

#define PI          (3.1415926)

/*********************************************************************************************************
  名    称: circleArea 
  描    述: 求圆的面积
  输    入: r  半径
  输    出: 圆的面积
*********************************************************************************************************/
float   circleArea (float  r)
{
	return  (PI * r * r);
}
/*********************************************************************************************************
  名    称: circlePerimeter 
  描    述: 求圆的周长
  输    入: r  半径
  输    出: 圆的周长
*********************************************************************************************************/
float   circlePerimeter (float  r)
{
	return  (2 * PI * r);
}

通过一段更易懂的常数算式来表示常数,更能提高代码可读性,同时也不用人工来计算该常数。常数算式是在编译时就进行计算了,不会消耗目标CPU的时间。

#define YEAR_SECONDS                (60 * 60 * 24 * 365UL)

宏定义的内容要用括号括起来,防止展开时表达错误。如下所示,函数 func本来是要算两数和与差的乘积,但实际展开却成了a + b * a - b因为相乘运算的优先级高,使得计算顺序与预期不符。如果把定义内容扩起来则不会出现这种问题。

#define SUM(a, b)                    a + b
#define DIF(a, b)                    a - b

int  func (int a, int b)
{
	return  (SUM(a, b) * DIF(a, b));
}

func(41) ==> 4 + 1 * 4 - 1 ==>4 + 4 - 1 ==> 7
#define SUM(a, b)                    (a + b)
#define DIF(a, b)                    (a - b)

int  func (int a, int b)
{
	return  (SUM(a, b) * DIF(a, b));
}

func(41) ==> (4 + 1) * (4 - 1) ==>5 * 3 ==> 15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ScilogyHunter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值