c++ - 在 AVR 的程序内存中构建编译时任意长度数组

标签 c++ c arrays avr-gcc

我正在尝试寻找一种聪明的方法来为 AVR 架构构建复合编译时数组。该数组的结构应如下所示:

  • 它应该完全驻留在程序内存中;
  • 它由一系列连续的(无符号)字节组成,又名 uint8_t
  • 它应该使用任意长度的字节段构建;
  • 一个段按顺序由一个长度字节和一系列数据字节组成,长度字节为数据字节数。

下面是这样一个数组的例子:

static const uint8_t data[] PROGMEM = {
    1, 0x01,
    3, 0xBE, 0x02, 0x00,
    3, 0x3D, 0x33, 0x33,
    15, 0xE1, 0xD0, 0x00, 0x05, 0x0D, 0x0C, 0x06, 0x2D, 0x44, 0x40, 0x0E, 0x1C, 0x18, 0x16, 0x19,
    0 /* end of the sequence */
};

我想避免每次从序列中添加或删除字节时调整长度字节的负担,例如,以某种形式的伪代码:

BEGINNING_OF_THE_SEQUENCE(identifier)
    SEGMENT(0x01),
    SEGMENT(0xBE, 0x02, 0x00),
    ...
END_OF_THE_SEQUENCE()

在上面的示例中,我选择了一个显式字节数组声明,但它可以以任何方式构建,例如使用结构等。唯一的前提是必须保证出场顺序。

所以简而言之,我想“连接”字节系列,其长度必须在编译时计算,并作为系列本身的长度字节放在每个字节系列的前面。

我考虑过使用 variadic macros但我也想研究其他方法,例如类和函数模板、元编程等等,并考虑使用最少的代码。我也不想求助于 C++11-specific,因为到目前为止我使用的当前 avr-gcc 编译器的支持是有限的。

我有预感可以使用模板,但我被卡住了。有什么想法吗?

最佳答案

这是一个适用于 C++11 及更高版本的简单示例,可能会有所帮助:

template <typename ...Args>
constexpr std::size_t n_args(Args...) { return sizeof...(Args); }

#define ELEM(...) n_args(__VA_ARGS__), __VA_ARGS__

#include <iostream>

int main()
{
    unsigned int a[] = { ELEM(4, 9, 16),
                         ELEM(100),
                         ELEM(10, 20, 30, 40, 50),
    };

    for (auto n : a ) std::cout << n << " ";
    std::cout << '\n';
}

或者,如果您想要 C99 解决方案而不是 C++11 解决方案,您可以使用 sizeof 复合字符数组文字代替 n_args:

#define ELEM(...) sizeof((char[]){__VA_ARGS__}), __VA_ARGS__

我不知道在 C++03 中可以使用类似的简单方法。

关于c++ - 在 AVR 的程序内存中构建编译时任意长度数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46504211/

相关文章:

c++ - 分配内存后构造函数未捕获异常

arrays - SKSpritenode数组展示

c++ - 在论文中引用/引用 OpenMP

C - SizeOf 指针

c - 如何在 Visual Studio 2005 上检测未引用的 C/C++ 代码?

c - Lua中为什么使用索引方法而不是特殊方法

python - 类型错误 : Mismatch between array dtype ('object' ) and format specifier ('%.18e' )

php - Symfony Doctrine 数组结果的 Flatten Array Result

c++ - 重新 -'new' TCHAR* 数组

c++ - 为什么复制构造函数调用其他类的默认构造函数?