элемент инициализатора не является постоянным при использовании постоянных структур

Я работаю с PIC32, MPLABX и XC32, и в настоящее время мне приходится делать много аппаратных описаний для каждого периферийного устройства. Некоторые из заданий примерно такие:

В файле1.h

extern const stream_t EHAL_PIN_STREAM_TEMPLATE;

В файле1.с

const stream_t EHAL_PIN_STREAM_TEMPLATE = { 
    .field1 = constant, .field2 = constant, ... 
}

В файле2.h

#include "file1.h"

const stream_ehal_pin_t EHAL_STREAM_PIN_RF1 = {
    .stream = EHAL_PIN_STREAM_TEMPLATE,
    .pin = &EHAL_PIN_RF1
};

По сути, я создаю карту между нашими потоками и цифровым выводом PIC32.RF1, и я хотел сделать это, используя константные глобальные переменные, но я получаю ошибку initializer element is not constant, когда пытаюсь использовать EHAL_PIN_STREAM_TEMPLATE.

Знаете ли вы какое-либо решение, кроме инициализации EHAL_STREAM_PIN_RF1 во время выполнения?

ИЗМЕНИТЬ

Поскольку я не хотел выполнять инициализацию во время выполнения, моим решением было создать один макрос для каждого поля EHAL_PIN_STREAM_TEMPLATE и использовать эти макросы для заполнения структур EHAL_STREAM_PIN_RF1:

 #include "file1.h"

 const stream_ehal_pin_t EHAL_STREAM_PIN_RF1 = {
    .stream = {FIELD1_TEMPLATE_VALUE, FIELD2_TEM...},
    .pin = &EHAL_PIN_RF1
 };

person rnunes    schedule 06.01.2014    source источник


Ответы (1)


Невозможно делать то, что вы хотите.

Есть три момента времени для инициализации:

  • время компиляции

  • время ссылки

  • время выполнения

Для инициализации во время компиляции требуется значение при компиляции - для этого вы можете использовать макросы, но не значение переменной из другой единицы компиляции (другого файла .c), поскольку оно просто недоступно за пределами этой единицы компиляции.

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

Инициализация во время выполнения также является опцией, но вам это не понравилось...

Обычно люди определяют макросы в заголовочном файле (который может быть включен в несколько файлов .c) для такой цели, если инициализация во время выполнения нежелательна.

person Laszlo Valko    schedule 06.01.2014