Перейти к содержанию
    

Объявление функций для интерпретатора команд

Для уменьшения избыточности и повторов в коде, сделал макрос для объявления функции и одновременного объявления элемента структуры с именем функции и адресом для вызова.

 

#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. Тот же вопрос но теперь нужна генерация команд (как та в примере) для модификации полей структур.

 

С++ и далее не интересуют. Внешний парсер-генератор если только очень легкий/простой. Ничего не остается?

 

Спасибо.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё можно https://en.wikipedia.org/wiki/X_Macro вспомнить.

 

Я довольно активно использую разновидность этого метода; разве что вместо #define LIST ... использую отдельный файл со списком.

Также вместо X(name) можно использовать несколько разных идентификаторов, и, в зависимости от места, разворачивать их в одинаковые или разные конструкции (например, "указать, какие поля надо сохранять").

 

PS на stackowerflow мужики развлекаются на полную катушку :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может быть полезно, да, если в нескольких местах надо разворачивать, но это все таки список который надо отдельно объявить. А сделать добавление в список на макросах похоже нельзя. Чтобы объявлять элементы списка в разных местах.

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...