如何用非易失性结构初始化易失性结构?

How to initialise a volatile structure with a non-volatile structure?

背景

我正在尝试创建 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.

有关

What am I missing? ... It may be related to this.

是的,您缺少 volatile 的正确复制函数

您错过了错误消息的实际内容。编译器告诉您,一次性分配整个结构需要一个 "copy constructor" ,它理解 volatile 限定符,但没有一个。查看 this answer 以讨论错误的含义。

但是,当您将结构的各个元素一一分配时,不需要复制构造函数,因此代码可以正常工作。你为什么"trying to avoid"这个?

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

为易失性结构定义常用复制构造函数没有用,因为您的并发要求与其他人的不同。

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

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

但是你必须准确分析你需要什么,这就跑题了。