Почему структуры не могут быть назначены напрямую?

Предположим, что у меня есть полностью определенная структура с тегом 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. Есть ли причина этого?

Ответы

Ответ 1

То, что вы ищете, это сложный литерал. Это было добавлено к языку на C99.

Ваш первый случай:

struct MyStruct q = {x,y,..,z};

- синтаксис, специфичный для инициализации. Ваш второй случай, в педантике языка, не является инициализацией, а назначением. Правая часть задания должна быть структурой правильного типа. До C99 на языке не было синтаксиса для написания строкового литерала, который вы пытаетесь сделать. {x, y,.., z} выглядел как блок с выражением внутри. Если бы кто-то вдохновлялся, чтобы попытаться представить его как буквальное значение, хотя язык не сделал этого, нельзя было быть уверенным в его типе. (В вашем контексте вы могли бы сделать хорошее предположение.)

Чтобы разрешить эту проблему и решить проблему с типом, C99 добавил синтаксис, чтобы вы могли написать:

q = (struct MyStruct){x,y,...,z};

Ответ 2

Вы можете сделать это, но вам нужно указать тип структуры до вашего агрегата:

struct MyStruct q;
q = (struct MyStruct){x,y,...,z};