为什么第二条语句创建分配给非左值的''main.c?

问题描述 投票:0回答:2

嗨,下面这些语句之间有什么区别?

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

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

c macros lvalue mikroc
2个回答
0
投票
我认为您想将0b1000000000000000发送到微控制器的端口或全局发送到缓冲区。将| =更改为|

为什么遇到错误?

考虑您的宏之一:

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

在此宏中,您尝试执行此操作:

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

是否可以在

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


1
投票
[x |= yx = 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;

© www.soinside.com 2019 - 2024. All rights reserved.