Вкратце
Как сделать так, чтобы при компиляции мингв размер (u)int_fast8_t был 1 байт, а (u)int_fast16_t — 2 байта?
Подробно
У меня есть программа для 8-битного проца. А в ней — сериализация объектов в епром
template<class T>
void serialize(Stream *s, T&v) {
s.serialize(&v, sizeof(v));
}
struct A{
uint_fast8_t a;
#if A_HAS_B
uint_fast16_t b;
#endif
uint_fast32_t notSerialize;
void serialize(Stream *s) {
serialize(s, a);
#if A_HAS_B
serialize(s, b);
#endif
}
} a[100];
struct B { ... } b[20];
struct C { ... } c[30];
MEMORY_MAP(
/// кол-во
/// размер сериализуемой части элемента
(a, 100, 3)
(b, 20, 5)
(c, 30, 1)
);
MEMORY_MAP по количеству объектов и размеру данных для сериализации вычисляет адреса в епроме.
Проблема в том, что размер этой части элемента зависит от директив компиляции и может отличаться в разы. Если брать максимальные размеры, то я не помещаюсь в епром. Кроме того, надо не забывать менять размеры при изменении элементов — в общем геморрой. Сделать вычисление размера динамически не охота — на кэш не хватает ОЗУ, а считать каждый раз при сохранении — долго.
Появилась мысль скомпилировать это скажем мингв, подставить новую функцию main, посчитать в ней размеры сериализуемых частей объектов (подсунув специальный поток для сериализации) и сгенерить карту епрома. А потом эту карту уже компилировать кросс-компилятором.
Однако я использую xxx_fastY_t типы, а на мингв они будут иметь другой размер. Т.е. мне нужно что-то вроде typedef unsigned char uint_fast8_t, однако такое противоречит объявлениям в stdint.h.
Пока приходит в голову только глобальный find/replace uint_fast8_t на какой-нить uint_f8_t.
Нет ли способа получше?