c - тип - Почему структуры не могут быть назначены напрямую?
тип данных структура (2)
Предположим, у меня есть полностью определенная структура с тегом MyStruct
, и предположим, что x, y, ..., z
являются допустимыми значениями для его полей. Почему
struct MyStruct q = {x,y,..,z};
разрешено, но
struct MyStruct q;
q = {x,y,...,z};
не допускается? Я нахожу это очень раздражающим. Во втором случае, где я ранее объявил q
, мне нужно присвоить значение каждому полю одно за другим:
q.X = x; q.Y = y; ... q.Z = z;
где X, Y, ..., Z
- поля MyStruct
. Есть ли причина этого?
Вы можете сделать это, но вам нужно указать тип структуры перед агрегатом:
struct MyStruct q;
q = (struct MyStruct){x,y,...,z};
То, что вы ищете, является составным литералом. Это было добавлено к языку в C99.
Ваш первый случай:
struct MyStruct q = {x,y,..,z};
это синтаксис, специфичный для инициализации. Ваш второй случай, в педантике языка это не инициализация, а присвоение. Правая часть присваивания должна быть структурой правильного типа. До C99 в языке не было синтаксиса для написания структурного литерала, что вы пытаетесь сделать. {x, y, .., z} выглядело как блок с выражением внутри. Если кто-то был вдохновлен попытаться думать об этом как о буквальном значении, хотя язык этого не сделал, нельзя было быть уверенным в его типе. (В вашем контексте вы могли бы сделать хорошее предположение.)
Чтобы разрешить это и решить проблему типа, C99 добавил синтаксис, чтобы вы могли написать:
q = (struct MyStruct){x,y,...,z};