В чем смысл двойных фигурных скобок, инициализирующих 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?
Спасибо заранее.
Ответы
Ответ 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 в качестве значения.