error: unsequenced modification and access to <argument>

error: unsequenced modification and access to <argument>

在此代码中:

#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编译它时,没有产生错误。

我在这里看到了这个问题 但答案实际上并没有帮助。所以我不明白,为什么会这样?这个错误是什么意思?

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

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