【问题标题】:How to initialise a volatile structure with a non-volatile structure?如何用非易失性结构初始化易失性结构?
【发布时间】:2016-12-27 15:01:27
【问题描述】:

背景

我正在尝试创建struct 的两个实例。其中一个不会更改,因此声明为const,但另一个可能会异步更改,因此我想将其设为volatile

问题

我正在尝试使用结构的const 实例来初始化volatile 之一。但是,如果我使用 volatile 关键字,编译器会抛出此错误:

passing 'volatile rect' as 'this' argument of 'rect& rect::operator=(rect&&)' discards qualifiers [-fpermissive]at line 15 col 8

可重现的例子

#include <Arduino.h>

struct rect {
    int x0;
    int y0;
    int width;
    int height;
};

const    rect outer    = {0, 0, 10, 5};
volatile rect inner;

void setup() {
    inner = {outer.x0 + 1, outer.y0 + 1,
             outer.width - 2, outer.height - 2};
}

void loop() {
    ;
}

省略volatile 编译正常:

rect inner = {outer.x0 + 1, outer.y0 + 1,
                            outer.width - 2, outer.height - 2};

逐一初始化也可以,但这正是我要避免的:

inner.x0        = outer.x0 + 1;
inner.y0        = outer.y0 + 1;
inner.width     = 0;
inner.height    = outer.height - 2;

问题

我错过了什么? ...可能与this有关。

【问题讨论】:

  • 编译器输出看起来像你在编译C++,为什么它被标记为C?
  • 我正在为 Arduino 嵌入式平台开发,它是 C 和 C++ 的混合体。不幸的是,当出现错误时,我并不总是确定我的代码落在围栏的哪一边。 C++ 会更合适吗?
  • 是的,operator= 在 C 中无效。
  • 这显然是 C++,但它被标记为 C。
  • 谢谢,标签已更改。 C 已移除,C++Arduino 已添加。

标签: c++ struct arduino initialization volatile


【解决方案1】:

您错过了错误消息的实际内容。编译器告诉您,一次性分配整个结构需要一个“复制构造函数”,它理解 volatile 限定符并且没有。查看this answer 以了解错误的含义。

但是当您一一分配结构的各个元素时,不需要复制构造函数,因此代码可以正常工作。你为什么要“试图避免”这个?

您希望 volatile 限定符做什么?在 C/C++ 中,它ONLY 阻止编译器优化你的变量或使用它们的代码。仅此而已。

为 volatile 结构定义一个普通的复制构造函数是没有用的,因为您的并发要求与其他人的不同。

为保证您的结构元素分配一致,您可能需要禁用中断,如下所示:

cli();
inner.x0        = outer.x0 + 1;
inner.y0        = outer.y0 + 1;
inner.width     = 0;
inner.height    = outer.height - 2;
sei();

但您必须准确分析您需要什么,这与主题无关。

【讨论】:

  • 1.) 我试图避免它纯粹是为了节省代码空间。 2.) 我需要volatile 因为该变量将被 ISR 修改,因此我必须确保它不会被编译器缓存或优化。 3.) 在这种特定情况下,初始化是在附加中断之前完成的,但这是一个很好的建议,请牢记。后来只有width 被ISR 访问。非常感谢!
【解决方案2】:

我错过了什么? ...可能与this有关。

是的,您缺少 volatile 的正确复制 c'tor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 2015-11-07
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多