我有像:
这样的宏#define INCREMENT(ip) *ip++
#define RETAIN(ip) *ip
在代码中,我使用它们:
*op |= INCREMENT(ip)<<15;
*op |= INCREMENT(ip)<<20 | RETAIN(ip);
我的问题是,当我收到警告时,我没有收到第一行的警告:
&#34;'* ip'上的操作可能未定义[-Wsequence-point]&#34;
第二行。
出了什么问题?
我应该如何更改我的宏以避免该警告?
注意:我在代码中有几个使用宏的语句。我无法改变所有这些(整洁的任务)。所以,请告诉我写宏的完美方式,以获得警告。
答案 0 :(得分:4)
该行:
*op |= INCREMENT(ip)<<20 | RETAIN(ip);
被预处理成
*op |= *ip++ << 20 | *ip;
由于*ip++ << 20
和*ip
之间没有序列点,ip
的后增量可以在评估*ip
之前或之后排序。因此操作具有未定义的行为。
作为旁注:为了避免其他(无关)麻烦(Macro Pitfalls),请用以下内容替换宏定义:
#define INCREMENT(ip) (*(ip)++)
#define RETAIN(ip) (*(ip))
答案 1 :(得分:2)
第二个例子扩展后变为
*op |= *ip++ << 20 | *ip;
此处未定义在*ip
递增之前或之后是否读取第二 ìp
的值。