【发布时间】:2017-09-30 15:29:30
【问题描述】:
我正在尝试找出一种聪明的方法来为 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 的具体细节,因为目前我正在使用的 avr-gcc 编译器的支持是有限的。
我有一种预感,可以使用模板,但我被卡住了。有什么想法吗?
【问题讨论】:
-
您不能使用运行时机制来更改编译时结构。
-
它可以通过一些聪明的方式完成:P
-
没有可变参数模板和 constexpr 这似乎不现实,而使用更新的 C++ 标准这绝对是可能的。
-
C != C++。使用您实际使用的语言进行标记。
-
@Nasha:我相应地更新了我的答案。