Заполнить массив через препроцессор? - PullRequest
0 голосов
/ 01 июня 2018

Привет и извините, если это уже было задано где-то еще.

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

В основном это выглядит так:

    #define ITEMS

    typedef struct {
      uint8_t item0;
      uint8_t item1;
    } Item_t;

    Item_t Items[]={ITEMS};

Поэтому я искал и пытался реализовать что-то вроде:

    ADD_ITEM(0,0);

Идея состоит в том, что макрос ADD_ITEM должен просто расширяться до {0,0}, и к нему должен быть добавлен объектоподобный макрос ITEMS.

Есть идеи или советы?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Я получил глобальный массив, и мой код является модульным.

Хотя эти два утверждения не полностью противоречат друг другу, они не подходят друг другу.Избегайте глобальных данных.

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

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

Поэтому я искал и пытался реализовать что-то вроде:

ADD_ITEM(0,0);

Идея состоит в том, что макрос ADD_ITEM должен просто расширяться до {0,0} и к этому следует добавить объектно-подобный макрос ITEMS.

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

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

0 голосов
/ 01 июня 2018

IMO это очень сложно (если возможно) и подвержено ошибкам.

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

Вы также можете создать таблицу таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...