我创建了一个类,看起来像一个数组,但它不是将数据保存在程序本身中,而是从文件中流式传输字节(以减少RAM的影响)。现在我已经让所有这些工作正常运行,但程序员必须使用以下方式定义类:
请注意,这是针对嵌入式处理器的,asm指令通过汇编器中的一个工具来创建只读文件。
所以我的问题是:我如何消除“location”和“size”变量?我讨厌程序员必须手动输入它们,并且更希望有一种在编译时生成它们的方式。因此,程序员不需要输入:
他们只需要输入:
#define CreateReadOnlyBlock(name, location, size, ...) \
template<> \
const unsigned int ReadOnlyBlock<location, size>::Data[] \
__asm__( ".readonly__" #location "__" #name) \
= { __VA_ARGS__ }; \
ReadOnlyBlock<location, size> name;
例子:
//A read only array of {0, 1, 2, 3}
CreateReadOnlyBlock(readOnlyArray, 0, 4, 0, 1, 2, 3);
请注意,这是针对嵌入式处理器的,asm指令通过汇编器中的一个工具来创建只读文件。
所以我的问题是:我如何消除“location”和“size”变量?我讨厌程序员必须手动输入它们,并且更希望有一种在编译时生成它们的方式。因此,程序员不需要输入:
//A read only array at location 0 of {0, 1, 2, 3}
CreateReadOnlyBlock(readOnlyArray1, 0, 4, 0, 1, 2, 3);
//A read only array at location 4 of {4, 5, 6, 7}
CreateReadOnlyBlock(readOnlyArray2, 4, 4, 4, 5, 6, 7);
他们只需要输入:
CreateReadOnlyBlock(readOnlyArray1, 0, 1, 2, 3);
CreateReadOnlyBlock(readOnlyArray2, 4, 5, 6, 7);
适当的常量将被生成。基本上,我正在寻找一种根据先前的定义在编译时生成和放置这些常量的方法。 C++11是可以使用的,只是我对它不是很熟悉(constexpr似乎可行?)。如果C预处理器不会使它变得更丑陋,那么也可以使用。这可能吗?
为了清晰起见进行编辑:
在ReadOnlyBlock类中有这个方法:
template<const int _location, const int _size> class ReadOnlyBlock
{
...
unsigned int operator[] (size_t index)
{
return LoadFromROM(index + _location);
}
}
我无法想出如何打破位置变量和ROM文件之间的内在相互依赖关系。 我确实对工具链有完全控制权,但我需要一种方式来传递汇编器工具如何构建文件以及指示C ++代码文件中块的位置。
另一个编辑:
文件及其块可能非常大,多达1k个字,因此许多预处理器魔法可能会崩溃。 还要感谢所有人到目前为止提供的帮助!
location
的字符串值,将其与字符串字面量连接起来,然后将结果传递给了__asm__
。 你的__asm__
支持constexpr
字符串吗? :) - Yakk - Adam Nevraumont