嗨,下面这些语句之间有什么区别?
#define RES_WRITE 0Xf0f0
#define DATA (0x0000 |= (1<<15))
#define DATA (RES_WRITE |= (1<<15))
当将DATA分配给一个int变量时,它会显示一个错误,例如“分配给非左值。我可以知道这个错误的原因以及如何解决该错误我在做什么错误吗?
为什么遇到错误?
考虑您的宏之一:
#define DATA (0x0000 |= (1<<15))
在此宏中,您尝试执行此操作:
0x0000 = 0x0000 | (1<<15))
是否可以在0x0000上写数据?0x0000是值;这意味着它在内存中没有任何位置。
x |= y
是x = x | y
的简写,所以最终得到0 = 0 | (1 << 15)
在此表达式中,您试图将某些内容分配给文字,这是不可能的。而且|
是冗余的,因为0 | x
始终只是x
。从您的评论
[我想屏蔽不同的位,然后将所有位分配给一个变量]似乎您想要简单的常量来屏蔽单个位:
#define DATA (1 << 15)
这是仅设置了1位的整数,可以用作掩码。由于各种原因,在现代C ++中,您应该首选constexpr
而不是宏:
constexpr unsigned DATA = 1 << 15;
您可以像您提到的那样使用两者
auto x = DATA | 0x00f0 | 0x0100;