Встроенная статическая инициализация C ++ массивов структур - PullRequest
0 голосов
/ 25 октября 2019

При переходе на C ++ мне требуется определенная функция, которая кажется устаревшей.
sorry, unimplemented: non-trivial designated initializers not supported

Как правильно реализовать следующую систему хранения данных в C ++ для систем с ограничением памяти?

typedef union union_t {
    float f;
    int i;
} arg;

typedef struct type_t {
    int a;
    arg b;
    int d;
} element;

const element list[] = {
    {
      .a = 1,
      .b = { .f = 3.141519f },
      .d = 6
    },
    {
      .a = 3,
      .b = { .i = 1 },
    }
};

Часто предлагается использовать std:map или std:vector. Что подходит, однако list является неизменным и должен иметь возможность компилировать и ссылаться на определенный блок флэш-памяти. И то, и другое кажется непригодным для этой цели.

Самое лучшее, что я могу сделать, - это ARM Compiler 6, то есть C ++ 14.

1 Ответ

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

То, как вы показали, почти полностью соответствует входящему стандарту C ++ 20. Только то, что .d также должно быть инициализировано. Является ли это тем, что я предлагаю использоватьчтобы справиться с этим в C ++ 14, вы должны инициализировать его explicilty:

typedef union union_t {
    float f;
    int i;
} arg;

typedef struct type_t {
    int a;
    arg b;
    int d;
} element;

const element list[] = {
    {
      /*.a = */ 1,
      /*.b = */ { /*.f = */ 3.141519f },
      /*.d = */ 6
    },
    {
      /* .a = */ 3,
      /* .b = */ { /* .i = */ 1 },
      0
    }
};
...