Код
#define SH_DEF(name) \
extern void name(const char *s); \
const shCMD_t __CMDEF_1__ cm_ ## name = { #name, &name}; \
void name(const char *s)
...
#define __CMDEF_1__ __attribute__ ((section (".cmdef_1")))
#define __CMDEF_2__ __attribute__ ((section (".cmdef_2")))
extern void name(const char *s); \
const shCMD_t __CMDEF_1__ cm_ ## name = { #name, &name}; \
void name(const char *s)
...
#define __CMDEF_1__ __attribute__ ((section (".cmdef_1")))
#define __CMDEF_2__ __attribute__ ((section (".cmdef_2")))
В ld скрипте добавил.
Код
. = ALIGN(4);
cmList = .;
*(.cmdef_1)
*(.cmdef_2)
cmList = .;
*(.cmdef_1)
*(.cmdef_2)
Функция теперь объявляется просто и ее имя упоминается только в одном месте.
Код
SH_DEF(pm_scal_B1)
{
stof(&pm.scal_B[1], s);
printf("%4e" EOL, &pm.scal_B[1]);
}
...
const shCMD_t __CMDEF_2__ cm_NULL = {NULL, NULL};
{
stof(&pm.scal_B[1], s);
printf("%4e" EOL, &pm.scal_B[1]);
}
...
const shCMD_t __CMDEF_2__ cm_NULL = {NULL, NULL};
Вопросы:
1. Какие еще есть способы? можно ли обойтись без вмешательства в ld скрипт?
2. Как можно подобно показанному автоматизировать сохранение (сериализация) полей структуры? Лишь указав при объявлении структуры какие поля надо сохранять, а дальше вызов некой save(const struct foo *p, void * dest).
3. Тот же вопрос но теперь нужна генерация команд (как та в примере) для модификации полей структур.
С++ и далее не интересуют. Внешний парсер-генератор если только очень легкий/простой. Ничего не остается?
Спасибо.