#c #struct #initialization
#c #структура #инициализация
Вопрос:
У меня есть структура следующего вида:
struct transform {
double A[4][4];
};
Я знаю, что могу инициализировать всю структуру следующим образом:
struct transform myTransform;
myTransform = (struct transform){{{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0}}};
Но почему я не могу сделать следующее?
struct transform secondTransform;
secondTransform.A = {{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0}};
Моя логика говорит, что это имеет смысл. Я просто расширяю ту же логику, что и раньше, но инициализирую только A
матрицу внутри моей структуры, но получаю неоднозначную Expected expression
ошибку.
Причина, по которой я спрашиваю, заключается в том, что у меня в моем проекте есть более сложная структура, чем эта, и я хотел бы конкретно инициализировать элементы внутри этой структуры вместо всего этого.
Редактировать: Я использую стандарт C99 для своего проекта.
Комментарии:
1. Потому что этот синтаксис будет работать только тогда, когда переменная определена — даже если это может показаться логичным.
2. @WeatherVane Но это определено в
struct transform
, не так ли?3.
secondTransform.A =
это не определение, это присвоение, и правила синтаксиса говорят «нет».
Ответ №1:
Проблема, с которой вы сталкиваетесь, заключается в том, что первый случай является инициализацией, в то время как второй случай является присвоением, и вы не можете присвоить массиву.
Однако вы можете инициализировать структуру без явной инициализации всех членов. Это делается с помощью назначенного инициализатора.
struct transform {
double A[4][4];
int b;
char *c;
};
struct transform t = { .A = {{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0}}, .b = 5 };
Любое поле, не инициализированное явно, неявно инициализируется значением 0 или NULL в зависимости от типа.
Комментарии:
1. Назначенный инициализатор. Это именно то, что я потратил 45 минут на поиск в Google. Спасибо!
Ответ №2:
Нет фундаментальной причины, по которой компилятор C нельзя было бы спроектировать так, чтобы он мог понять, что вы там имели в виду. Просто так получилось, что C позволяет использовать инициализацию фигурных скобок только в определенных случаях, и это не один из них.
Комментарии:
1. Так это тот случай, когда «никто не подумал добавить это в стандарт C»?