要将字符串存储在 PROGMEM 中,avr-gcc
您必须编写如下内容:
constexpr const char str[] PROGMEM = "test";
当你想使用这个字符串时,你必须使用很多不同的函数(pgm_read_byte
, strcpy_P
,...)。
因为我不想记住所有这些功能,所以我更喜欢实现一个类来隐藏所有这些功能。实现很简单:
template <size_t N>
class Progmem_string{
public:
constexpr static size_t size() {return N;}
char operator[](size_t i) const
{ return pgm_read_byte(&data[i]); }
template<typename T2>
Progmem_string& operator=(const T2&) = delete;
const char data[N];
};
要使用它,您唯一需要记住的是编写 PROGMEM 和数组的正确大小:
constexpr Progmem_string<5> str PROGMEM {"test"};
...
strcpy(buffer, str); // easy to use and to implement
但是这个实现有两个基本问题:
- 用户可以将字符串的大小写成小。例如:
constexpr Progmem_string<5> str {"this is a very big string"};
我想测试字符串的长度是否真的是 N。一种方法(不起作用)是:
Progmem_string(const char str0[N]) : str{str0}
{
static_assert(N == strlen(str0));
}
- 不得不写 2 次 PROGMEM 这个词很奇怪。如果可以的话,我更愿意写来定义我的字符串,例如:
constexpr Progmem_string<5> str {"test"};
以及要在类中编写的 PROGMEM。这也行不通。
有什么帮助吗?谢谢。