Кодогенерация с использованием информации из программы
От: enji  
Дата: 09.07.13 08:01
Оценка:
Есть кодогенератор, который разбирает файл конфигурации вида
Параметр1 = 12;
Параметр2 = 422;

и формирует "компактное" представление в виде
const unsigned char settings[] = {
  1,0, // 2 байта на код параметра
    1, // длина значения
    12, // значение
  2,0,
    2,
    422&0xff,422>>8, 
};

Однако значения параметров часто являются константами в программе. К примеру
enum {Const1 = 12, Const2 = 422};

и хотелось бы в файле конфигурации использовать именно имена констант.

Проблема в том, как кодогенератор узнает значения Const1 и Const2?

Пришла в голову мысль сгенерить и запустить программу вида
#include "..."
#include <iostream>

void main() {
  std::cout << "Const1: " << Const1 << "\n";
  // ...
}

однако у меня кросскомпиляция, поэтому не сработает.

Как вариант, можно скомпилировать такую программу
#include "..."
int64_t data[] = {0x456567768768, 0x7896542135, 
  Const1, Const2};
void main() {}

а потом в бинарнике найти маркеры и дальше вытащить значения. Однако как-то сильно сложно получается...

Нет ли какого-то более простого решения?

Еще была мысль генерить что-то типа UNPACK(Const1), но внутри макроса размер тоже неизвестен...

ЗЫ gcc
ЗЫЫ Конечно можно считать именованные константы 4-байтными и согласиться с потерей нескольких байт флэша на параметр , но проснулся спортивный интерес
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.