Первый оператор создает переменную, инициализированную для заданных значений, то есть эти значения встроены в память и сохраняются непосредственно в исполняемом файле программы по этому адресу переменной (для глобальных переменных) или готовы для копирования в память (для переменных стека).
Второй оператор второго блока сильно отличается. Хотя это выглядит похоже, это выражение присваивания. Это означает, что RHS оператора equals является выражением, которое оценивается (независимо от того, что находится в LHS of =), а затем передается оператору =. Без надлежащего контекста {...}
не имеет никакого значения.
В C99 вы можете сделать это:
struct_name_id = (struct struct_type_id){ value1, value2, value3 };
Теперь RHS оператора equals является допустимым выражением, поскольку компилятор должен знать, что находится в {...}
.
В C ++ 11 синтаксис:
struct_name_id = struct_type_id{ value1, value2, value3 };