在C中可能未定义Opearation

时间:2016-07-20 16:33:10

标签: c macros

我有像:

这样的宏
#define INCREMENT(ip) *ip++
#define RETAIN(ip) *ip

在代码中,我使用它们:

*op |= INCREMENT(ip)<<15;
*op |= INCREMENT(ip)<<20 | RETAIN(ip);

我的问题是,当我收到警告时,我没有收到第一行的警告:

  

&#34;'* ip'上的操作可能未定义[-Wsequence-point]&#34;

第二行。

出了什么问题?

我应该如何更改我的宏以避免该警告?

注意:我在代码中有几个使用宏的语句。我无法改变所有这些(整洁的任务)。所以,请告诉我写宏的完美方式,以获得警告。

2 个答案:

答案 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的值。