如何用非易失性结构初始化易失性结构?
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();
但是你必须准确分析你需要什么,这就跑题了。
背景
我正在尝试创建 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();
但是你必须准确分析你需要什么,这就跑题了。