如下定义:
#ifndef uint32_t
#define uint32_t int
#endif
#define BYTE2WORD(b) ((b) / sizeof(uint32_t)) /* byte to word */
#define BYTE2QWORD(b) ((b) / (4 * sizeof(uint32_t))) /* byte to quadruple-word */
#define QWORD2BYTE(qw) ((qw) * sizeof(uint32_t) * 4)
#define BYTE2QWORD_LOW_BOUND(b) (BYTE2QWORD(b))
#define BYTE2QWORD_HIGH_BOUND(b) (BYTE2QWORD((b) + (QWORD2BYTE(1) – 1)))
注意,宏里面,传递进来的变量,一定要加括号,这个最基本的常识,我刚才就不小心犯了,写成
#define BYTE2QWORD(b) (b / (4 * sizeof(uint32_t))) /* byte to quadruple-word */
这样就导致
#define BYTE2QWORD_HIGH_BOUND(b) (BYTE2QWORD((b) + (QWORD2BYTE(1) – 1)))
实际上变成了:
b + (16 – 1) / 16 = b
了,不是期望的(b+(16-1))/16。
这样的错误,真是。。。。
———————————-
【20100813】
突然才发现,上面的错误,其实不是我写的代码的错,而是预处理,把我宏定义中的(),自动给去掉了。
所以,才会变成b + (16 – 1) / 16 = b,而不是我期望的((b+(16-1))/16)。
由此可见,还是在宏定义的时候,在传入的时候,对参数加括号,而不是在整个宏外面加括号。
即,最好是这样的做法:
#define BYTE2QWORD(b) ((b) / (4 * sizeof(uint32_t))) /* byte to quadruple-word */
而这样做:
#define BYTE2QWORD(b) (b / (4 * sizeof(uint32_t))) /* byte to quadruple-word */
有可能就出现上述问题,即传入的带了括号的b,b的最外层的括号,被预处理器简化掉了。。。
就导致出问题了。
转载请注明:在路上 » 【教训】定义宏的时候,一定要加括号