为什么 AVR-GCC 编译器在使用相同的变量但作为 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上问过这个问题,但我没有任何答案,所以我想了很久之后才问一次再来这里。

解决方法

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

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

,

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...