宏定义和括号

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


例如在编写一个简单的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更符合我们的阅读习惯。


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

你可能感兴趣的:(C)