需要左值作为一元‘&’操作数

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

我有以下几行代码:

#define PORT 9987

char *ptr = (char *)&PORT;

这似乎适用于我的服务器代码。但当我在客户端代码中编写它时,它给出了以下错误消息:

lvalue required as unary ‘&’ operand

我做错了什么?

c pointers
3个回答
41
投票

C 预处理器在这里发挥作用。代码经过预处理后,如下所示。

char *ptr = (char *)&9987;

(

&
) 运算符的地址可以应用于变量而不是文字。


8
投票

预处理器宏没有内存,在编译时宏会被值替换。所以实际上这里发生的事情是

char *ptr = (char *)&9987
;,这是不可能的。


0
投票

我有以下几行代码:

#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);
© www.soinside.com 2019 - 2024. All rights reserved.