2012-08-30 8 views
18

Załóżmy, że mam w pełni zdefiniowaną strukturę ze znacznikiem MyStruct i przypuszczam, że x, y, ..., z są dozwolone wartości dla jej pól. DlaczegoDlaczego nie można bezpośrednio przypisywać struktur?

struct MyStruct q = {x,y,..,z}; 

dozwolone, ale

struct MyStruct q; 
q = {x,y,...,z}; 

nie jest dozwolone? To bardzo denerwujące. W drugim przypadku, gdzie już wcześniej zadeklarowanej q, muszę przypisać wartość do każdego pola, jeden po drugim:

q.X = x; q.Y = y; ... q.Z = z; 

gdzie X, Y, ..., Z są pola MyStruct. Czy istnieje jakiś powód?

+0

RValue z cesji nie jest beton i jego w czasie wykonywania. początkowe przypisanie jest jednak konkretne i dostępne w postaci binarnej (najprawdopodobniej w sekcji .BSS, jeśli jest to plik elfa). jeśli chcesz przypisać sobie struktury, możesz przypisać q do czegoś zainicjowanego. lubić; struct MyStruct w = {x, y, .., z}; q = w – sardok

Odpowiedz

26

Co szukasz jest związkiem dosłowne. Zostało to dodane do języka w C99.

Twój pierwszy przypadek:

struct MyStruct q = {x,y,..,z}; 

jest składnia specyficzne inicjalizacji. Twój drugi przypadek, w pedantyce języka, nie jest inicjalizacją, ale zadaniem. Prawa strona przypisania musi być strukturą odpowiedniego typu. Przed C99 nie było składni w języku, aby napisać struct literal, co właśnie próbujesz zrobić. {x, y, .., z} wyglądało jak blok z wyrażeniem w środku. Gdyby ktoś zainspirował się, by próbować myśleć o nim jako o wartości dosłowności, chociaż języka tego nie było, nie można być pewnym tego typu. (. W swoim kontekście, można zrobić dobre przypuszczenie)

Aby to umożliwić i rozwiązać problem typu, C99 dodaje składnię więc można napisać:

q = (struct MyStruct){x,y,...,z}; 
+3

+1 dla określenia, że ​​jest to C99. Nie wiedziałem, że to możliwe, ponieważ prawdopodobnie musimy pracować ze starymi kompilatorami. – Leo

23

Można to zrobić, ale trzeba podać typ konstrukcji przed agregatu:

struct MyStruct q; 
q = (struct MyStruct){x,y,...,z}; 
+0

Oto przykład [link do ideone] (http://ideone.com/rB1Fz). – dasblinkenlight

+2

Ale tylko w C99 (patrz odpowiedź Avi Bergera) – AAT

+0

@AAT Masz rację, to funkcja dodana w C99. Jednakże, ponieważ C99 istnieje już od ponad dekady, niemal stała się synonimem C w wielu kontekstach. – dasblinkenlight

Powiązane problemy