0

要将字符串存储在 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

但是这个实现有两个基本问题:

  1. 用户可以将字符串的大小写成小。例如:
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));
}
  1. 不得不写 2 次 PROGMEM 这个词很奇怪。如果可以的话,我更愿意写来定义我的字符串,例如:
constexpr Progmem_string<5> str {"test"};

以及要在类中编写的 PROGMEM。这也行不通。

有什么帮助吗?谢谢。

4

0 回答 0