我有以下几行代码:
#define PORT 9987
和
char *ptr = (char *)&PORT;
这似乎适用于我的服务器代码。但当我在客户端代码中编写它时,它给出了以下错误消息:
lvalue required as unary ‘&’ operand
我做错了什么?
C 预处理器在这里发挥作用。代码经过预处理后,如下所示。
char *ptr = (char *)&9987;
(
&
) 运算符的地址可以应用于变量而不是文字。
预处理器宏没有内存,在编译时宏会被值替换。所以实际上这里发生的事情是
char *ptr = (char *)&9987
;,这是不可能的。
我有以下几行代码:
#define PORT 9987
访问端口/特殊功能寄存器的常见模式是
#define PORT_ADDR 9987
#define PORT (* (volatile uint32_t*) PORT_ADDR)
前提是它是32位寄存器。 现在您可以像普通变量一样评估它并编写:
void func (uint32_t val)
{
if (PORT == 0)
PORT = val;
}
您可以传递(易失性)地址:
extern void do_something (volatile uint32_t *port);
do_something (& PORT);