2009-11-10 15 views
10

mogłem zrobić inicjalizacji struct z kodem:Inicjalizacja strukturalna języka programowania C/C++?

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

ale nie mógł z:

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

dlaczego mogłem zrobić to z tego pierwszego, ale nie mógł z tym ostatnim z gcc, g ++, vc2008 , vc6? Innymi słowy, dlaczego język programowania c/C++ nie obsługuje tej składni?

dzięki.

+3

Gdzie mogę dowiedzieć się więcej o tym języku programowania C/C++? Czy ma stronę internetową? –

Odpowiedz

22

Pierwsza instrukcja tworzy zmienną zainicjowany do podanych wartości, czyli wartości te są budowane w pamięci i przechowywane bezpośrednio w pliku wykonywalnego programu w danym adres zmienny (dla globaliów) lub gotowy do kopiowania pamięci (dla zmiennych stosowych).

Druga instrukcja drugiego bloku jest bardzo różna. Chociaż wygląda podobnie, jest to wyrażenie przypisania. Oznacza to, że RHS operatora równości jest wyrażeniem, które jest oceniane (niezależnie od tego, co jest w LHS = =), a następnie przekazywane do operatora =. Bez właściwego kontekstu, {...} nie ma żadnego znaczenia.

W C99, można to zrobić:

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

Teraz RHS z operatorem równa jest prawidłowy wyraz, ponieważ nie jest właściwy kontekst dla kompilatora, aby wiedzieć, co jest w {...}.

w C++ 11, składnia jest:

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

@Juliano: C89 również obsługuje ten typ składni akordów dla gcc. – Jichao

+2

@jcyang: GCC może zezwalać na tę składnię, ale nie jest to C89/C90 (jest to rozszerzenie GCC). Na przykład MSVC, Digital Mars i Comeau nie (chyba że włączasz obsługę C99 w Comeau) obsługują tę składnię. –

+0

@michael: ale użyłem przełącznika --std = c89 – Jichao

2

Wystarczy rzucić wartości jako takie:

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

nie wiem dlaczego C nie pierwotnie wesprzeć jakąś składnią do „ponownie zainicjować” struct pomocą czegoś podobnego liście inicjatora - zdarzają się sytuacje, w których byłbym przydatny. Jako Juliano mentioned, C99 (i C++ 0x) naprawił go do pewnego stopnia, ale często muszę trzymać się C90. Kiedy chcę coś takiego zrobić, czasami robię co następuje:

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

// .... 

myFoo = init_foo; // reinitialize myFoo 
0

Czy to zadziała?

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

@FractalSpace: To nie może działać. Po prostu zdefiniuj jeden alias do struct name id, ale nie zmienić inne rzeczy. – Jichao

0

wychodził podobny problem, a rozwiązanie tego było to, że próby zainicjowaniu struct poza funkcją (a nie z wykorzystaniem składni inicjator, ale z obj.member = wartość; zapisu). Jest to problem pokrewny, więc publikuj tutaj, mając nadzieję, że pojawi się tutaj ktoś o tym samym pytaniu.

Powiązane problemy