【问题标题】:Passing a pointer to a struct with a volatile member as a function argument将指向具有 volatile 成员的结构的指针作为函数参数传递
【发布时间】:2019-10-01 03:17:14
【问题描述】:

如果我有一个结构,其中一些成员是 volatile 但不是全部,并且我将指向该结构的指针作为函数参数传递,编译器是否会阻止对函数中的这些成员进行优化,或者我是否必须声明指针也很不稳定?

typedef struct {
    volatile uint16_t reg1;
    volatile uint16_t reg2;
    const uint32_t speed;
    uint8_t error;
}uart;

void uartInitialize(uart *const hdlPtr);
//void uartInitialize(volatile uart *const hdlPtr); is this required?

【问题讨论】:

  • 称之为迷信,但我不相信 typdefs 中的 volatile 关键字。我不相信所有编译器在 typdef 中的 volatile 行为都相同。我只相信完整的变量,并且只相信变量的定义。
  • 我建议重复,因为问题没有显示 volatile 指针(如所述),而是显示 const 指向 volatile 变量的指针。在那个星座中,它是一个复制品。请随意指出,您实际上想要一个 volatile 指针,而不是评论停用的代码。在那种情况下,我承认它不是重复的。 (我相信这里没有欺骗锤。
  • 考虑将const 指针(指向volatile 变量)定义为volatile 以及const 对我来说似乎很奇怪。请仔细检查这是否是您真正想要的,因为注释代码没有显示 volatile 指针,它是指向 volatile 变量的 const 指针,这恰好是我所相信的——假设指向的变量也是定义易失性......

标签: c pointers struct volatile


【解决方案1】:

简答:无需在 hdlPtr 上添加 volatile。

长答案:除非 hdlPtr 可以以某种意想不到的方式更改,否则没有必要将其声明为 volatile。鉴于它是函数本地的,它不能被 uartInitialize 以外的任何东西改变。鉴于您将其声明为“const”,因此 uartInitialize 本身不能对其进行更改。

【讨论】:

    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 2013-08-11
    • 2012-07-22
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    相关资源
    最近更新 更多