Warum können Strukturen nicht direkt zugewiesen werden?

Lesezeit: 3 Minuten

Benutzer-Avatar
Becko

Angenommen, ich habe eine vollständig definierte Struktur mit Tag MyStructund nehme das an x, y, ..., z sind zulässige Werte für seine Felder. Warum ist

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 erklärt habe qmuss ich jedem Feld nacheinander einen Wert zuweisen:

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

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

  • rvalue der Zuweisung ist nicht konkret und läuft zur Laufzeit. Die anfängliche Zuweisung ist jedoch konkret und in Binärform verfügbar (höchstwahrscheinlich im Abschnitt .BSS, wenn dies eine Elf-Datei ist). Wenn Sie Strukturen einander zuweisen möchten, können Sie q etwas Initialisiertes zuweisen. wie; struct MyStruct w = {x,y,..,z}; q = w

    – sardok

    30. August 2012 um 4:06 Uhr


Benutzer-Avatar
Avi Berger

Was Sie suchen, ist ein zusammengesetztes Literal. Dies wurde der Sprache in C99 hinzugefügt.

Ihr erster Fall:

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

ist eine für die Initialisierung spezifische Syntax. Ihr zweiter Fall, in der Pedantik der Sprache, ist nicht Initialisierung, sondern Zuweisung. Die rechte Seite der Zuweisung muss eine Struktur des richtigen Typs sein. Vor C99 gab es keine Syntax in der Sprache, um ein Struct-Literal zu schreiben, was Sie versuchen. {x,y,..,z} sah aus wie ein Block mit einem Ausdruck darin. Wenn man sich dazu inspirieren ließ, es als wörtlichen Wert zu betrachten, obwohl die Sprache dies nicht tat, konnte man sich seines Typs nicht sicher sein. (In Ihrem Kontext könnten Sie eine gute Vermutung anstellen.)

Um dies zuzulassen und das Typproblem zu lösen, hat C99 eine Syntax hinzugefügt, damit Sie Folgendes schreiben können:

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

  • +1 für die Angabe, dass es sich um C99 handelt. Wusste nicht, dass dies möglich ist, was wahrscheinlich daran liegt, dass wir mit alten Compilern arbeiten müssen.

    – Löwe

    30. August 2012 um 6:00 Uhr

Sie können dies tun, aber Sie müssen den Typ der Struktur vor Ihrem Aggregat angeben:

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

  • Aber nur in C99 (siehe Antwort von Avi Berger)

    – AAT

    30. August 2012 um 7:49 Uhr

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

    – Sergej Kalinitschenko

    30. August 2012 um 12:22 Uhr

  • @AAT Es funktioniert nicht. Ich verwende Visual Studio 2010, Windows. Ich erhalte einen Syntaxfehler und es wird nicht kompiliert. Ich würde erwarten, dass Visual Studio die neuesten Standards unterstützt. Mir muss irgendwo eine Einstellung fehlen, oder so. Irgendwelche Ideen? Vielleicht sollte ich eine neue Frage mit diesem Problem eröffnen?

    – wink

    30. August 2012 um 22:59 Uhr


  • @becko: Deine Erwartungen sind viel zu hoch … MS-Tools verwenden selten die neuesten Standards.

    – Karoly Horvath

    30. August 2012 um 23:04 Uhr


  • Verdammt… du hast Recht. Ich habe gerade das gefunden: stackoverflow.com/q/146381/855050. Nachdem ich ein wenig gegoogelt habe, scheint es, dass MS keine Pläne hat, C99 oder C11 zu unterstützen.

    – wink

    30. August 2012 um 23:43 Uhr

1372410cookie-checkWarum können Strukturen nicht direkt zugewiesen werden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy