bit_is_set(optos(),opt)
扩大宏观bit_is_set:
((*(volatile uint8_t *)(((uint16_t) &(optos())))) & (1 << (opt)))
不工作,并显示错误消息:需要左值作为一元 '&' 操作数。
但这:
uint8_t a=optos();
bit_is_set(a,opt)
工作正常。
为什么?
如何使用带函数返回的地址运算符“&”?
bit_is_set(optos(),opt)
扩大宏观bit_is_set:
((*(volatile uint8_t *)(((uint16_t) &(optos())))) & (1 << (opt)))
不工作,并显示错误消息:需要左值作为一元 '&' 操作数。
但这:
uint8_t a=optos();
bit_is_set(a,opt)
工作正常。
为什么?
如何使用带函数返回的地址运算符“&”?
出于同样的原因,这是行不通的:
uint8_t optos() {
return 4;
}
int main(void) {
uint8_t* addr = &optos();
return 0;
}
error: lvalue required as unary ‘&’ operand
的&
操作需要一个左值返回的地址。一个临时右值(在你的情况下,从optos()
返回的值)不能得到它的地址,并且需要首先绑定到一个左值。
'optos()'返回一个值,而不是一个对象。值没有地址。 – pmg 2014-11-03 19:40:55
'&'是*地址*操作符,而不是方向操作符。你可能认为“方向”与“间接”相反,但这并不常见。 – 2014-11-03 19:48:27
感谢您的澄清。 :-) – chuy 2014-11-03 19:56:06