Инициализация времени компиляции с помощью константного указателя из функции - PullRequest
0 голосов
/ 05 июня 2018

У меня есть структура, которая определяется следующим образом:

typedef struct {
    sn74lvc138a_options_t decoder_opts;
    uint32_t pin_int;
    uint32_t pin_rst;
    uint32_t pin_pwr;
    ...
} w5500_options_t;

Вложенная структура sn74lvc138a_options_t выглядит следующим образом:

static const sn74lvc138a_options_t sn74lvc138a_opts ={
    .decoder_a = DECODER_A_GPIO,
    .decoder_b = DECODER_B_GPIO,
    .decoder_c = DECODER_C_GPIO,
    .decoder_sel = DECODER_SEL_GPIO
};

Эти два хранятся в двух разных модулях C.Один из модулей C (тот, который также содержит экземпляр w5500_options_t) имеет следующую определенную функцию:

static const sn74lvc138a_options_t* _get_spi_decoder(void) {
    return cpu_samv71_get_sn74lvc138a();  // This is a function from the other C module
}

Я хотел бы иметь возможность сделать следующее для инициализации времени компиляции:

static const w5500_options_t w5500_opts = {
    .pin_int = SOMEVALUE1,
    .pin_rst = SOMEVALUE2,
    .pin_pwr = SOMEVALUE3,
    .decoder_opts = _get_spi_decoder()
};

По сути, я пытаюсь получить ссылку на экземпляр структуры внутри блока инициализации.Поскольку сама ссылка определена как const, и функция возвращает указатель const, компилятор должен иметь возможность сделать это (я использую GCC с C99).

Вопрос теперь: это вообще не разрешеноили я делаю что-то не так, что запрещает это.Точное сообщение об ошибке, которое я получаю от компилятора, состоит в том, что «элемент инициализатора не является константой».

1 Ответ

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

Это не разрешено, по той же причине, что компилятор так услужливо дает вам.

Думайте о действии во время выполнения, соответствующем инициализации, как о memcpy() из вашего исполняемого файла и куда-тов вашем процессе куча;это все, что вы получаете.Набор битов установлен в предопределенный шаблон, функции не вызываются.

...