C 中带有 #define 的指针

发布于 2024-10-08 21:43:38 字数 465 浏览 10 评论 0原文

函数:

#define ASSOC(port) (*(volatile bit_field *) (&port))

函数调用:

#define SCLK ASSOC(PORTC).bit0

bit_field 定义为这样的结构:

typedef struct {
 unsigned char bit0 :1, bit1 :1, bit2 :1, bit3 :1, bit4 :1, bit5 :1,
   bit6 :1, bit7 :1;
} bit_field;

我不知道 &port 是在哪里定义的。

有人可以解释一下该函数是如何读取的以及它是如何工作的吗?我不太擅长指针,尤其是这个例子,前面和末尾的“*”以及“&”非常令人困惑。与端口。

谢谢

The function:

#define ASSOC(port) (*(volatile bit_field *) (&port))

The function call:

#define SCLK ASSOC(PORTC).bit0

bit_field defined as a struct like this:

typedef struct {
 unsigned char bit0 :1, bit1 :1, bit2 :1, bit3 :1, bit4 :1, bit5 :1,
   bit6 :1, bit7 :1;
} bit_field;

I don't know where &port is defined.

Can someone please explain how the function is read and how it works please? I am not very good with pointers and this example in particular is very confusing with "*" in the front and at the end and the "&" with the port.

Thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

凉城已无爱 2024-10-15 21:43:38

端口未定义。这是 ASSOC 的参数,您可以在此处看到:

#define ASSOC(port) /* etc. */

此外,我认为它应该是一个 char,因为 bit_field 有 8 位。 &port 中的 & 只是用于获取其在内存中的地址。

ASSOC 依次将 &port 转换为 易失性 bit_field *,然后在开头有额外的 * 直接指向内容结果指针。

因此,一旦调用 ASSOC(port),就可以将其用作 bit_field 类型结构体。例如,SCLK 宏将给出PORTC 的第一位。

port is not defined. It is the argument to ASSOC as you can see here:

#define ASSOC(port) /* etc. */

Also, I assume it is supposed to be a char, because the bit_field has 8 bits. The & in &port simply serves to get its address in memory.

ASSOC in turn casts &port to a volatile bit_field * and then there is the extra * at the beginning to point directly to the contents of the resulting pointer.

Therefore, once you call ASSOC(port), you can use it as a bit_field type structure. For example, the SCLK macro will give the first bit of PORTC.

旧梦荧光笔 2024-10-15 21:43:38

您定义的 ASSOC 宏是就地转换。

  1. 您传入一个值port(在本例中,它来自另一个宏SCLK
  2. ASSOC 获取port<的地址/code> 与 & 运算符
  3. ASSOCport 的地址转换为 (易失性位域 *)
  4. < code>ASSOC 取消引用 (*s) 地址bit_field

结果与您开始时的位相同,但可用作 bit_field 结构。

The ASSOC macro you define is an in-place cast.

  1. You pass in a value port (in this case, it's coming from the other macro SCLK)
  2. ASSOC takes the address of port with the & operator
  3. ASSOC casts port's address to a (volatile bit_field *)
  4. ASSOC dereferences (*s) the address of the bit_field

The result is the same bits as you started with, but usable as a bit_field struct.

南城追梦 2024-10-15 21:43:38

ASSOC 采用我假设的名为 PORTCchar 并返回一个具有相同值的 bit_field PORTC 中的每个单独位。

SCLK 返回位字段中的一位。

您将使用 PORTC 并将其作为参数传递给 ASSOC

ASSOC takes what I'm assuming is a char named PORTC and gives back a bit_field with the same values as each individual bit in PORTC.

SCLK returns one of the bits in the bit field.

You're taking PORTC and passing it to ASSOC as the parameter.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文