错误:无序修改和访问<argument>

时间:2015-09-28 17:46:10

标签: c gcc clang

在此代码中:

#include <stdio.h>

#define SHIFT(value,num_of_bits) ((num_of_bits) > 0) ? \
                ((value) <<= (num_of_bits)) : ((value) >>= (-(num_of_bits)))

int main(void)
{
    unsigned int w1 = 0177777u, w2 = 0444u;

    printf("SHIFT(w1,5) = %o\tw1 << 5 = %o\n", SHIFT(w1,5), w1 << 5);

    return 0;
}

当我使用 clang 进行编译时,我收到以下错误:

错误:无序修改和访问w1

但是当我使用 gcc 编译它时,不会产生任何错误。

我在这里看到了这个问题unsequenced modification and access to pointer,但答案实际上并没有帮助。所以我不明白为什么会发生这种情况?这个错误意味着什么?

1 个答案:

答案 0 :(得分:1)

那是因为你试图修改value定义中的第一个参数SHIFT。尝试按如下方式修改宏:

#define SHIFT(value,num_of_bits) ((num_of_bits) > 0) ? \
                ((value) << (num_of_bits)) : ((value) >> (-(num_of_bits)))