Подтвердить что ты не робот

В чем смысл двойных фигурных скобок, инициализирующих C-структуру?

В настоящее время я работаю с устаревшим кодом на С++, успешно скомпилированным с gcc 2.9.X.
Мне было предложено перенести этот код устаревшего на gcc 3.4.X. Большинство ошибок были легко исправлены, но этот вопрос меня озадачил.

Контекст:

 struct TMessage 
   {
    THeader header;
    TData data;
   };

 struct THeader
   {
    TEnum myEnum;
    TBool validity;
   };

Что было сделано:

 const TMessage init = {{0}};

 /* Later in the code ... */
 TMessage message = init;

Мой вопрос (ы):
В чем смысл оператора {{}}? Инициализирует ли первое поле (заголовок) двоичное значение 0? Инициализирует ли первое поле первой структуры (перечисление) значение (литерал) 0?

Ошибка 3.4.6, которую я получаю, составляет invalid conversion from 'int' to 'TEnum', либо с одной, либо с двумя парами фигурных скобок.

Как я могу установить свою структуру в группу из 0 без использования memset?

Спасибо заранее.

4b9b3361

Ответ 1

Он инициализирует все поля структуры POD равными 0.

Обоснование:

const SomeStruct init = {Value};

Инициализирует первое поле SomeStruct значением Value, остальная часть структуры равна нулю (я забываю раздел в стандарте, но там где-то)

Таким образом:

const SomeOtherStruct init = {{Value}};

Инициализирует первое поле первого поля структуры (где первое поле структуры само по себе является структурой POD) для значения, а остальное первое поле - нулю, а остальная часть структуры - 0.

Кроме того, это только не работает, потому что С++ запрещает неявное преобразование int в типы перечисления, поэтому вы можете сделать:

const SomeOtherStruct init = {{TEnum(0)}};

Ответ 2

  • Первые скобки для struct TMessage
  • Вторая фигурная скобка для struct THeader
  • Нулевой литерал для TEnum myEnum

В этом случае вы инициализируете TEnum с помощью int 0, который равен incompatible conversion.

Итак, вы должны добавить кастинг следующим образом:

const TMessage init = {{TEnum(0)}};

В C/С++, если вы partially initialized структура или массив (только некоторые из первых полей/элементов), остальные будут инициализированы default constructor (которая является нулевой инициализацией для примитивных типов). Ошибка компиляции произойдет, если конструктор по умолчанию отсутствует или конструктор объявлен как private.

Ответ 3

Вы можете использовать его как многомерный массив (если это помогает). Вы затем reset два измерения до 0 с этой командой. Это работает с (я полагаю), что значения внутри структуры могут принимать значение 0 в качестве значения.