Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Объявление функций для интерпретатора команд
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
amaora
Для уменьшения избыточности и повторов в коде, сделал макрос для объявления функции и одновременного объявления элемента структуры с именем функции и адресом для вызова.

Код
#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
Ещё можно https://en.wikipedia.org/wiki/X_Macro вспомнить.

Я довольно активно использую разновидность этого метода; разве что вместо #define LIST ... использую отдельный файл со списком.
Также вместо X(name) можно использовать несколько разных идентификаторов, и, в зависимости от места, разворачивать их в одинаковые или разные конструкции (например, "указать, какие поля надо сохранять").

PS на stackowerflow мужики развлекаются на полную катушку :-)
amaora
Может быть полезно, да, если в нескольких местах надо разворачивать, но это все таки список который надо отдельно объявить. А сделать добавление в список на макросах похоже нельзя. Чтобы объявлять элементы списка в разных местах.

От отдельных секций лучше откажусь, непонятно какие есть гарантии того, что полученная таким образом структура не окажется дырявой.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.