如何解决为什么 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 举报,一经查实,本站将立刻删除。