C++ 如何用非易失性结构初始化易失性结构? 背景

C++ 如何用非易失性结构初始化易失性结构? 背景,c++,struct,arduino,initialization,volatile,C++,Struct,Arduino,Initialization,Volatile,我正在尝试创建一个结构的两个实例。其中一个不会更改,因此声明为const,但另一个可能会异步更改,因此我希望将其设置为volatile 问题 我试图使用结构的const实例来初始化volatile实例。但是,如果我使用volatile关键字,编译器会抛出以下错误: passing 'volatile rect' as 'this' argument of 'rect& rect::operator=(rect&&)' discards qualifiers [-fperm

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

问题 我试图使用结构的
const
实例来初始化
volatile
实例。但是,如果我使用
volatile
关键字,编译器会抛出以下错误:

passing 'volatile rect' as 'this' argument of 'rect& rect::operator=(rect&&)' discards qualifiers [-fpermissive]at line 15 col 8
可复制示例 一个接一个地初始化也有效,但这正是我试图避免的:

inner.x0        = outer.x0 + 1;
inner.y0        = outer.y0 + 1;
inner.width     = 0;
inner.height    = outer.height - 2;
问题: 我错过了什么。。。这可能是因为

我错过了什么。。。它可能与此相关


是的,您丢失了volatile的正确副本。您丢失了错误消息实际显示的内容。编译器告诉您,要一次性分配整个结构,需要一个“复制构造函数”,它可以理解volatile限定符,而没有。看一看,讨论错误的含义

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

您期望volatile限定符做什么?在C/C++中,它只会阻止编译器优化变量或使用它们的代码。没别的了

为易失性结构定义一个库存拷贝构造函数是没有用的,因为您的并发性需求与其他人的不同

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

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

但你必须准确地分析你需要什么,这就偏离了主题运算符=/COD>在C.中无效。这是明显的C++,但是它被标记为C++。谢谢,标签改变了。code>C
已删除,
C++
Arduino
已添加。
1。)
我试图避免它,纯粹是为了节省代码中的空间<代码>2。)我需要
volatile
,因为变量将被ISR修改,因此我必须确保编译器不会缓存或优化它<代码>3。)在这种特定情况下,初始化是在连接中断之前完成的,但最好记住这一点。稍后,ISR只能访问
width
。非常感谢!
inner.x0        = outer.x0 + 1;
inner.y0        = outer.y0 + 1;
inner.width     = 0;
inner.height    = outer.height - 2;
cli();
inner.x0        = outer.x0 + 1;
inner.y0        = outer.y0 + 1;
inner.width     = 0;
inner.height    = outer.height - 2;
sei();