最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【教训】定义宏的时候,一定要加括号

经验和教训 crifan 2341浏览 0评论

如下定义:

#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的最外层的括号,被预处理器简化掉了。。。

就导致出问题了。

转载请注明:在路上 » 【教训】定义宏的时候,一定要加括号

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
79 queries in 0.175 seconds, using 21.97MB memory