2009-11-10 4 views
10

я мог бы сделать инициализацию структуры с кодом:Инициализация структуры языка программирования C/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, г ++, VC2008 , vc6? Другими словами, почему язык программирования c/C++ не поддерживает этот синтаксис?

спасибо.

+3

Где я могу узнать больше об этом языке программирования C/C++? У него есть веб-страница? –

ответ

22

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

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

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

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

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

В C++ 11, синтаксис:

struct_name_id = struct_type_id{ value1, value2, value3 }; 
+0

@Juliano: C89 также поддерживает этот синтаксис синтаксиса типа gcc. – Jichao

+2

@jcyang: GCC может разрешить этот синтаксис, но это не C89/C90 (это расширение GCC). Например, в MSVC, Digital Mars и Comeau нет (если вы не включите поддержку C99 в Comeau), поддерживайте этот синтаксис. –

+0

@michael: но я использовал переключатель --std = c89 – Jichao

2

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

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

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

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

// .... 

myFoo = init_foo; // reinitialize myFoo 
0

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

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

@FractalSpace: он не может работать. Он просто определяет один псевдоним для struct name_id, но не делает изменить любые другие вещи. – Jichao

0

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

Смежные вопросы