【问题标题】:C macro parenthesis and asterisk in #define [duplicate]#define 中的 C 宏括号和星号 [重复]
【发布时间】:2021-07-22 08:24:06
【问题描述】:

我有来自 Nordic SoC 芯片的实时时钟 (RTC) 驱动程序的这行 C 代码。我试图寻找它的作用,但搜索起来有点困难。谁能告诉我它是做什么的?尤其是括号和星号。

#define NRF_RTC0                        ((NRF_RTC_Type            *) NRF_RTC0_BASE)

NRF_RTC_Type 是结构的 typedef,NRF_RTC0_BASE 被#define'ed 为 0x4000B000UL。

谢谢!

【问题讨论】:

  • 只是一个简单的文本替换,并没有什么特别的作用。
  • 这是一个类型转换,将NRF_RTC0_BASE 转换为指向NRF_RTC_TYPE 的指针
  • NRF_RTC0_BASE is typedef'ed as 0x4000B000UL 是什么意思?你不能 typedef 到一个值,你只能 typedef 到一个类型。
  • 如果这是一个谜,那不是一件坏事,但它确实表明你需要一个好的 reference book 来了解 C 的工作原理。我们无法在此处的答案中解释所有 C,您将需要进行大量学习才能了解正在发生的事情。这并不是那么复杂,但是在我们给出的任何解释都有意义之前,有很多原则需要吸收。
  • @tadman。感谢您分享这个。我一定会在我的 C 上工作。

标签: c memory arm embedded driver


【解决方案1】:

NRF_RTC0_BASE 标识位于地址4000B000 开始的一组硬件寄存器。 NRF_RTC_Type 定义了各个寄存器的映射,它可能添加了 volatile 限定符以确保它们被视为 I/O 而不是普通内存。

括号进行类型转换操作,星号表示指针类型。

使用宏NRF_RTC0 以结构化方式访问寄存器。

【讨论】:

    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多