2012-08-30 9 views
18

Angenommen, ich habe eine vollständig definierte Struktur mit dem Tag MyStruct und nehme an, dass x, y, ..., z Werte für ihre Felder zulässig sind. Warum ist10 Warum können Strukturen nicht direkt zugewiesen werden?

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

erlaubt, aber

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

ist nicht erlaubt? Ich finde das sehr ärgerlich. Im zweiten Fall, wo ich zuvor q erklärt habe, ich brauche einen Wert, der jedes Feld zugeordnet werden, eine nach der anderen:

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

X, Y, ..., Z wo die Bereiche MyStruct sind. Gibt es einen Grund dafür?

+0

rvalue der Zuordnung nicht konkret sind und sein in der Laufzeit. Die ursprüngliche Zuweisung ist jedoch konkret und in binärer Form verfügbar (am wahrscheinlichsten im Abschnitt .BSS, wenn es sich um eine Elf-Datei handelt). Wenn Sie sich gegenseitig Strukturen zuweisen wollen, können Sie q einem initialisierten Objekt zuweisen. mögen; Struktur MyStruct w = {x, y, .., z}; q = w – sardok

Antwort

26

Was Sie suchen, ist eine Verbindung wörtlich zu nehmen. Dies wurde der Sprache in C99 hinzugefügt.

Ihr erster Fall:

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

ist eine spezifische Syntax Initialisierung. Ihr zweiter Fall, in der Pedantik der Sprache ist nicht die Initialisierung, sondern die Zuweisung. Die rechte Seite der Zuweisung muss eine Struktur des richtigen Typs sein. Vor C99 gab es keine Syntax in der Sprache, um ein Strukturliteral zu schreiben, was Sie versuchen zu tun. {x, y, .., z} sah aus wie ein Block mit einem Ausdruck darin. Wenn man sich inspirieren ließ, es als einen buchstäblichen Wert zu betrachten, obwohl die Sprache es nicht tat, konnte man seiner Art nicht sicher sein. (. In Ihrem Kontext, könnten Sie eine gute Vermutung)

Um dies zu ermöglichen, und die Art Problem zu beheben, hinzugefügt C99 Syntax, so dass Sie schreiben können:

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

+1 für die Angabe, dass es sich um C99 handelt. Ich wusste nicht, dass das möglich war, wahrscheinlich weil wir mit alten Compilern arbeiten müssen. – Leo

23

Sie können dies tun, aber Sie müssen die Art der Struktur, bevor Ihr Aggregat liefern:

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

Hier ist ein [Link zu Ideone] (http://ideone.com/rB1Fz) mit einem Beispiel. – dasblinkenlight

+2

Aber nur in C99 (siehe Avi Berger's Antwort) – AAT

+0

@AAT Sie haben Recht, es ist eine Funktion, die in C99 hinzugefügt wurde. Seit es C99 jedoch schon seit mehr als einem Jahrzehnt gibt, ist es in vielen Kontexten zum Synonym für C geworden. – dasblinkenlight

Verwandte Themen