【发布时间】:2016-12-27 15:01:27
【问题描述】:
背景
我正在尝试创建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有关。
【问题讨论】:
-
编译器输出看起来像你在编译C++,为什么它被标记为C?
-
我正在为 Arduino 嵌入式平台开发,它是 C 和 C++ 的混合体。不幸的是,当出现错误时,我并不总是确定我的代码落在围栏的哪一边。
C++会更合适吗? -
是的,
operator=在 C 中无效。 -
这显然是 C++,但它被标记为 C。
-
谢谢,标签已更改。
C已移除,C++和Arduino已添加。
标签: c++ struct arduino initialization volatile