Что означает двойные фигурные скобки, инициализирующие C-структуру? - PullRequest
18 голосов
/ 06 июня 2011

В настоящее время я работаю с устаревшим 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? Инициализирует ли оно первое поле первой структуры ( enum ) (буквально) 0?

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

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

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

Ответы [ 3 ]

20 голосов
/ 06 июня 2011

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

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

const SomeStruct init = {Value};

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

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

const SomeOtherStruct init = {{Value}};

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

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

const SomeOtherStruct init = {{TEnum(0)}};
3 голосов
/ 06 июня 2011
  • Первые скобки для struct TMessage
  • Вторая скобка для struct THeader
  • Нулевой литерал для TEnum myEnum

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

Так что вы должны добавить кастинг вот так:

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

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

1 голос
/ 06 июня 2011

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

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