Инициализировать структуру с помощью макроса - PullRequest
0 голосов
/ 25 октября 2019

У меня есть эта структура

typedef struct {
    int Length;
    int Data[];
} MyStruct;

И этот макрос для инициализации структуры

#define FillStruct(...)     { .Length = sizeof((int[]){__VA_ARGS__}), .Data = {__VA_ARGS__} }

Таким образом, я могу инициализировать структуру с

MyStruct Obj = FillStruct(1, 2, 3, 4, 5);

Но этоне работаетЯ получил эту ошибку:

нестатическая инициализация элемента гибкого массива

Я могу скомпилировать код при изменении Obj в static инициализацию

static MyStruct Obj = FillStruct(1, 2, 3, 4, 5);

но теперь отладчик дает мне некоторые странные сведения об этом объекте.

enter image description here

Итак, как я могу решить эту проблему? Я ищу решение для инициализации этой структуры во время компиляции на встроенном устройстве (AVR MCU). В этом случае я не могу использовать решения с malloc и т. Д. И данные в этой структуре постоянны и сохраняются в памяти программы. Таким образом, приложение только читает эти данные.

1 Ответ

1 голос
/ 25 октября 2019

Я нашел одно решение. Компилятор выдает эту ошибку, потому что я объявил и инициализировал структуру внутри main. Перемещение этого сегмента из main решит эту проблему.

Окончательное решение выглядит следующим образом:

#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) 2 * N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

#define FillStruct(...)     { .Length = VA_NARGS(__VA_ARGS__), .Data = {__VA_ARGS__} }

const MyStruct Obj = FillStruct(1, 2, 3, 4, 5);

int main(void)
{
   int B = Obj.Data[2];
   // B = 3
}

Так что теперь все в порядке. Кажется, что неправильный вывод отладчика также появляется с ключевым словом const. Но теперь я могу удалить const и static, чтобы получить в структуре corrent Length (но не Data).

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