我正在尝试创建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有关。
答案 0 :(得分:1)
您错过了错误消息的实际内容。编译器告诉你,要一次性分配整个结构需要一个&#34;复制构造函数&#34;它理解挥发性限定符并且没有一个。请查看this answer,了解错误的含义。
但是当你逐个分配结构的各个元素时,不需要复制构造函数,因此代码工作正常。为什么你要&#34;试图避免&#34;此?
你期望挥发性资格赛者做什么?在C / C ++中, ONLY 会阻止编译器优化变量或使用它们的代码。没什么。
为易失性结构定义股票复制构造函数是没有用的,因为您的并发性要求会与其他人不同。
为了保证一致地分配结构元素,您可能需要禁用中断,如下所示:
cli();
inner.x0 = outer.x0 + 1;
inner.y0 = outer.y0 + 1;
inner.width = 0;
inner.height = outer.height - 2;
sei();
但是你必须准确地分析你需要什么,以及那个偏离主题的东西。
答案 1 :(得分:0)
我错过了什么? ......可能与
this
有关。
是的,您错过了适用于易失性
的副本c