微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 AVR-GCC 编译器在使用相同的变量但作为 PROGMEM 进行重载时会抛出错误? 问题演示:结尾:

如何解决为什么 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); 的双重声明。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。