Подтвердить что ты не робот

Инициализация структуры языка программирования C/С++?

Я мог бы выполнить инициализацию структуры с помощью кода:

struct struct_type_id struct_name_id = { value1, value2, value3 };

но не может:

struct struct_type_id struct_name_id;
struct_name_id = { value1, value2, value3 };

почему я мог сделать это с первым, но не мог с последним с gcc, g++, vc2008, vc6? Другими словами, почему язык программирования c/С++ не поддерживает этот синтаксис?

спасибо.

4b9b3361

Ответ 1

Первый оператор создает переменную, инициализированную заданными значениями, т.е. эти значения строятся в памяти и хранятся непосредственно в исполняемом программном обеспечении в этом адресе переменной (для глобалов) или готовы к копированию памяти (для переменных стека).

Второй оператор второго блока сильно отличается. Хотя он выглядит аналогичным, это выражение назначения. Это означает, что RHS оператора equals является выражением, которое оценивается (независимо от того, что находится в LHS = =), а затем передается оператору =. Без надлежащего контекста {...} не имеет никакого значения.

В C99 вы можете сделать это:

struct_name_id = (struct struct_type_id){ value1, value2, value3 };

Теперь RHS оператора equals является допустимым выражением, поскольку для компилятора существует соответствующий контекст, чтобы узнать, что находится в {...}.

В С++ 11 синтаксис:

struct_name_id = struct_type_id{ value1, value2, value3 };

Ответ 2

Я не знаю, почему C первоначально не поддерживал какой-то синтаксис для "повторной инициализации" структуры, используя что-то вроде списка инициализаторов - есть определенные моменты, когда я нашел бы его удобным. Как отметил Джулиано, C99 (и С++ 0x) зафиксировал его в определенной степени, но мне часто приходится придерживаться C90. Когда я хочу сделать что-то подобное, я иногда делаю следующее:

struct foo const init_foo = { 1, 2, 3};
struct foo myFoo;

// ....

myFoo = init_foo;  // reinitialize myFoo

Ответ 3

Вам просто нужно указать значения как таковые:

struct_name_id = (struct struct_type_id){ value1, value2, value3 };

Ответ 4

Будет ли это работать для вас?

typedef struct name_id {int value1; int value2; int value3;} NAME_ID;
name_id mynameid = {0,1,2};

Ответ 5

У меня возникла аналогичная проблема, и решение этого заключалось в том, что я пытался инициализировать структуру вне функции (не используя синтаксис инициализатора, но с записью obj.member = VALUE). Это связанная с этим проблема, поэтому размещение здесь, надеясь, что кто-то с тем же вопросом приземлится здесь.