Инициализация структуры в C с ошибкой: ожидаемое выражение
У меня есть такая структура:
struct foobar {
int i;
char *word;
};
Я знаю, что это будет работать:
struct foobar {
int i;
char *word;
};
struct foobar three = {3, "three"};
Почему это не работает:
struct foobar {
int i;
char *word;
} three;
three = {3, "three"};
Это даст ошибку: ожидаемое выражение
Спасибо!
3 ответа
"Инициализация" и "назначение", хотя и имеют довольно сходный синтаксис, - это две разные вещи с разными ограничениями.
"Инициализация" означает определение начального значения переменной прямо в процессе определения переменной. Присвоение, напротив, присваивает значение переменной, определенной в другом месте программы.
C не поддерживает присвоение значений переменным типа struct
или же array
, но поддерживает инициализацию переменных следующих типов:
struct foobar three = {3, "three"}
является инициализацией, поскольку значение определяется вместе с определением переменной. Это поддерживается в C и C++.
struct foobar three; three = {3, "three"}
напротив, это присваивание, потому что переменная сначала объявляется, а значение присваивается в отдельной инструкции. Это не поддерживается в C, но будет поддерживаться в C++.
Это не работает, потому что C не знает, какого типа {3, "три"} должно быть; C не смотрит на левую часть оператора "=", чтобы угадать ваш тип, поэтому у вас нет никакой информации о типе. С C99 вы можете использовать составной литерал для этого:
three = (struct foobar) { 3, "three" };
Приведение дает тип, значения в фигурных скобках инициализатора. Результат назначен вашей переменной три.
Похоже, вы пытаетесь использовать здесь так называемый "синтаксис создания экземпляров". К сожалению, это работает только в тот момент, когда вы объявляете переменную!
Если вы сделаете это после объявления (как в вашем примере), вам придется использовать один из наиболее громоздких способов.
Чтобы уточнить, как это будет работать:
struct foobar {
int i;
char *word;
} three = {3, "three"};
Причина этого:
struct foobar {
int i;
char *word;
} three;
three = {3, "three"};
не работает, потому что вы не определили структуру.
Ты хочешь сделать:
typedef struct foobar {
int i;
char *word;
} three;
После того, как вы напечатаете def, теперь три станут вашим новым типом данных, таким как int или char. Если вы хотите работать с тремя, вы хотите сделать это:
three x = {3, "three"};
Вы инициализируете переменную, такую как x, и присваиваете ей {3, "три"}