为什么 AVR-GCC 编译器在重载相同变量但作为 PROGMEM 时会抛出错误?

Why AVR-GCC compiler throws an error when overloading with the same variables but as PROGMEM?

我的问题更像是:为什么编译器 “认为” “PROGMEM 变量”"普通变量"?是因为 PROGMEM-keyword is "just" a macro 仅此而已吗?还是出于其他原因? 有什么解决方法吗..?

问题演示:

让我们考虑下面的例子:

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上问过这个问题但是我没有得到任何答案所以我想了很久才问再一次,在这里。

__attribute__((progmem))是编译器特性,不是C++语言特性,所以不参与重载决议。 object(int variable);object(int variable PROGMEM); 看起来都像是 object(int variable); 在 C++ 方面的双重声明。

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

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