-1

我的问题更像是:为什么编译器“认为”PROGMEM 变量”“普通变量”相同?是因为PROGMEM 关键字“只是”一个宏,仅此而已?还是出于其他原因?有什么解决方法..?

问题演示:

让我们考虑下面的例子:

class object {
public:
  object(int* variable);
  object(int* variable PROGMEM);
};

它抛出error: 'object::object(int*)' cannot be overloaded好像它是一样的。

sketch_jul31a:4:3: error: 'object::object(int*)' cannot be overloaded

   object(int* variable PROGMEM)

   ^~~~~~

sketch_jul31a:3:3: error: with 'object::object(int*)'

   object(int* variable)

   ^~~~~~

exit status 1
'object::object(int*)' cannot be overloaded

结局:

不久前我在开发图书馆时遇到了这个问题,我在arduino-forum上问过这个问题,但我没有任何答案,所以我想在很长一段时间后再次问这个问题,在这里.

4

2 回答 2

3

您不能期望编译器将链接器部分视为类型限定符,但您可以为 a 定义重载const int*,这非常接近 PROGMEM(ROM 位置)的语义。

我想知道你打算用它做什么const int*。你所能做的就是读取它,所以它基本上相当于一个普通的常int量值,增加了两个字节的 ROM 成本。

于 2021-07-31T18:49:19.690 回答
0

__attribute__((progmem))是编译器功能,而不是 C++ 语言功能,因此它不参与重载决议。两者object(int variable);object(int variable PROGMEM);看起来像object(int variable);C++ 中的双重声明。

于 2021-07-31T17:34:39.853 回答