为什么第二条语句会创建 Assigning to non-lvalue '' main.c?

why does the 2nd statement creates Assigning to non-lvalue '' main.c?

嗨,下面给出的这些陈述之间有什么区别?

 #define RES_WRITE 0Xf0f0
 #define DATA (0x0000 |= (1<<15))
 #define DATA (RES_WRITE |= (1<<15))

当 DATA 被分配给一个 int 变量时,它会显示一个错误,如“正在分配给非左值。 我可以知道这个错误背后的原因以及如何解决这个错误我犯了什么错误吗?

我认为您想将 0b1000000000000000 发送到微控制器的端口或全局发送到缓冲区。 将 |= 更改为 |

why you faced error?

考虑一下您的宏之一:

#define DATA (0x0000 |= (1<<15))

在这个宏中,你尝试这样做:

0x0000 = 0x0000 | (1<<15))

是否可以在0x0000上写入数据? 0x0000 是值;这意味着它在内存中没有任何位置。

x |= yx = x | y 的 shorthand,所以你最终得到

0 = 0 | (1 << 15)

在此表达式中,您试图将某些内容分配给文字,这是不可能的。 | 也是多余的,因为 0 | x 总是 x.

从您的评论 "i want to mask diffent bits and then assign all the bits to one variale" 看来您想要简单的常量来掩盖一个位:

#define DATA (1 << 15)

这是一个只设置了一位的整数,可以用作掩码。由于各种原因,在现代 C++ 中你应该更喜欢 constexpr 而不是宏:

constexpr unsigned DATA = 1 << 15;

你可以像你提到的那样使用两者

auto x = DATA | 0x00f0 | 0x0100;