Инициализация структуры в 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, "три"}

Другие вопросы по тегам