Инициализация структуры языка программирования C / C ++?

Я мог бы выполнить инициализацию структуры с помощью кода:

struct struct_type_id struct_name_id = { value1, value2, value3 }; 

но не мог:

 struct struct_type_id struct_name_id; struct_name_id = { value1, value2, value3 }; 

почему я мог сделать это с первым, но не мог с последним с gcc, g ++, vc2008, vc6? Другими словами, почему язык программирования c / c ++ не поддерживает этот синтаксис?

Благодарю.

Первый оператор создает переменную, инициализированную заданными значениями, т. Е. Эти значения строятся в памяти и хранятся непосредственно в исполняемом программном обеспечении в этом адресе переменной (для глобалов) или готовы к копированию памяти (для переменных стека).

Второй оператор второго блока сильно отличается. Хотя он выглядит аналогичным, это выражение назначения. Это означает, что RHS оператора equals является выражением, которое оценивается (независимо от того, что находится в LHS = =), а затем передается оператору =. Без надлежащего контекста, {...} не имеет никакого значения.

В C99 вы можете сделать это:

 struct_name_id = (struct struct_type_id){ value1, value2, value3 }; 

Теперь RHS оператора equals является допустимым выражением, поскольку для компилятора существует соответствующий контекст, чтобы узнать, что находится в {...} .

В C ++ 11 синтаксис:

 struct_name_id = struct_type_id{ value1, value2, value3 }; 

Я не знаю, почему C первоначально не поддерживал какой-то синтаксис для «повторной инициализации» структуры, используя что-то вроде списка инициализаторов – есть определенные моменты, когда я нашел бы его удобным. Как отметил Джулиано , C99 (и C ++ 0x) зафиксировал его в определенной степени, но мне часто приходится придерживаться C90. Когда я хочу сделать что-то подобное, я иногда делаю следующее:

 struct foo const init_foo = { 1, 2, 3}; struct foo myFoo; // .... myFoo = init_foo; // reinitialize myFoo 

Вам просто нужно указать значения как таковые:

 struct_name_id = (struct struct_type_id){ value1, value2, value3 }; 

Я столкнулся с аналогичной проблемой, и решением было то, что я пытался инициализировать структуру вне функции (не используя синтаксис инициализатора, но с записью obj.member = VALUE). Это связанная с этим проблема, поэтому размещение здесь, надеясь, что кто-то с тем же вопросом приземлится здесь.

Будет ли это работать на вас?

 typedef struct name_id {int value1; int value2; int value3;} NAME_ID; name_id mynameid = {0,1,2}; 
  • Структура структуры памяти C
  • Изменить переменную Struct в словаре
  • Как проверить, имеет ли переменная определенный тип (сравнивают два типа) в C?
  • Скопировать структуру в структуру в C
  • Есть ли способ перебрать структуру с элементами разных типов в C?
  • Как определить структуру в Matlab
  • Структурировать объекты в Java
  • Копирование одной структуры в другую
  • Литье одной структуры С в другую
  • C - освобождение структур
  • Маршал C ++ struct array в C #
  • Interesting Posts

    Как получить дополнительную информацию о высокопроизводительном процессе rundll32.exe?

    Как настроить перенаправление IP-адресов на маршрутизаторе NetGear N600 WNDR3400?

    Почему Ant дает мне неподдерживаемую ошибку версии major.minor

    ReactJS – Подъемное состояние вверх и сохранение локального состояния

    Равновесие и допуски с плавающей точкой

    Как получить String Array из файла arrays.xml

    Is “for (;;)” быстрее чем “while (TRUE)”? Если нет, то почему люди используют его?

    Почему неназванное пространство имен является «превосходной» альтернативой статическому?

    Изображение изображения на экране Android Pinch Zoom

    На настройке с двумя мониторами, как только один из двух будет повернут?

    Excel VBA – объединить строки с повторяющимися значениями в одной ячейке и объединить значения в другой ячейке

    «Родной шрифт не может быть создан» только для некоторых людей

    Как получить данные Active Directory текущего пользователя в C #

    Server.Transfer Vs. Response.Redirect

    iTextSharp – отправка PDF в формате PDF в приложении электронной почты

    Давайте будем гением компьютера.