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};




structure