amaora 24 8 марта, 2016 Опубликовано 8 марта, 2016 · Жалоба Для уменьшения избыточности и повторов в коде, сделал макрос для объявления функции и одновременного объявления элемента структуры с именем функции и адресом для вызова. #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"))) В ld скрипте добавил. . = ALIGN(4); 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}; Вопросы: 1. Какие еще есть способы? можно ли обойтись без вмешательства в ld скрипт? 2. Как можно подобно показанному автоматизировать сохранение (сериализация) полей структуры? Лишь указав при объявлении структуры какие поля надо сохранять, а дальше вызов некой save(const struct foo *p, void * dest). 3. Тот же вопрос но теперь нужна генерация команд (как та в примере) для модификации полей структур. С++ и далее не интересуют. Внешний парсер-генератор если только очень легкий/простой. Ничего не остается? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 10 марта, 2016 Опубликовано 10 марта, 2016 · Жалоба Ещё можно https://en.wikipedia.org/wiki/X_Macro вспомнить. Я довольно активно использую разновидность этого метода; разве что вместо #define LIST ... использую отдельный файл со списком. Также вместо X(name) можно использовать несколько разных идентификаторов, и, в зависимости от места, разворачивать их в одинаковые или разные конструкции (например, "указать, какие поля надо сохранять"). PS на stackowerflow мужики развлекаются на полную катушку :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amaora 24 10 марта, 2016 Опубликовано 10 марта, 2016 · Жалоба Может быть полезно, да, если в нескольких местах надо разворачивать, но это все таки список который надо отдельно объявить. А сделать добавление в список на макросах похоже нельзя. Чтобы объявлять элементы списка в разных местах. От отдельных секций лучше откажусь, непонятно какие есть гарантии того, что полученная таким образом структура не окажется дырявой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться