如何初始化具有非易失性结构的易失性结构?

时间:2016-12-27 15:01:27

标签: c++ struct arduino initialization volatile

背景

我正在尝试创建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有关。

2 个答案:

答案 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