宏定义和括号

为了尽量避免边际效应,宏定义时常要注意括号的使用。


例如在编写一个简单的MIN宏时,我们需要加上足够括号才能保证结果尽可能的正确。
#define MIN(X,Y) ((X)<(Y)?(X):(Y))
小提醒:在宏定义中最好全部使用大写字母,以区别正规的代码。


但有些情况下,加上括号却是“画蛇添足”的。
例如,用预处理指令#define声明一个常数,用以表明1年中有多少秒。
#define SECONDS_PER_YEAR (60*60*24*365)UL
单纯这一条宏定义是没有什么错误的,但如果替换到源代码中就会出现语法错误。
哪里错了呢?错在不应该加括号。
在整数值后面添加L或者l(小写的L,为了避免视觉错误最好使用L),表示此整数为long整型。
在整数值后面添加U或者u,表示此整数为unsigned整型。
如果各添加一个,也就是都在整数值直接加上后面加上U和L,那就表示unsigned long int型。
数值后面直接加U或者L才行,前边加上括号就不行了。
所以,正确的写法应该是这样
#define SECONDS_PER_YEAR 60*60*24*365UL
或者
#define SECONDS_PER_YEAR 60*60*24*365LU
L和U不分前后,但从可读性的角度来讲在数值后面加UL更符合我们的阅读习惯。


总结,宏定义会暗藏很多意想不到的危险,而搭配括号可以减小这种危险出现的可能性,但从根本而言改变不了宏定义的本质(字符替换)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值