Wozu dient ein konstantes Union-Objekt?

Lesezeit: 3 Minuten

Benutzer-Avatar
Zirkonimbo

Wenn ich ein konstantes Union-Objekt mache (z. B. im folgenden Code), kann darin keine Mitgliederzuweisung erfolgen. Hat es also auf jeden Fall Sinn, ein const union-Objekt zu erstellen?

union un
{
    int i;
    float f;
    char c;
};
const union un a; 
/// ! a.i = 10; error.

  • Im c Es ist nicht ungewöhnlich, eine Union durch ein anderes Element als das zuletzt festgelegte zu interpretieren. Und natürlich könnte es sein const volatile – dh wir werden es nicht ändern, aber jemand anderes könnte es tun, und wir müssen in der Lage sein, das zu sehen.

    – BoBTFisch

    10. August 2012 um 8:12 Uhr


  • Nicht, wenn die ganze verdammte Gewerkschaft ist const.

    – Welpe

    10. August 2012 um 8:14 Uhr

  • @Xeo, es würde ohne den “union” -Teil nicht kompiliert, als ich mit gcc getestet habe.

    – Prof. Falken

    10. August 2012 um 8:14 Uhr

  • @AmigableClarkKant: Ja, ich dachte, die Frage wäre zuerst nur mit C++ getaggt, aber es ist auch C, also das union “elaborate type specifier” macht es portabel. Ich rollback’d mein Rollback. 😛

    – Xeo

    10. August 2012 um 8:15 Uhr

Sie können die Union trotzdem wie folgt initialisieren:

const union un a = { .i = 100 }; 

dann verwenden Sie es in Ihrem Code.

  • In C, das ist. Ich denke, in C++ könnte man einen Konstruktor und solche Sachen schreiben.

    – Xeo

    10. August 2012 um 8:12 Uhr

  • Haha, du bist mir um 35 Sekunden zuvorgekommen. 🙂

    – Prof. Falken

    10. August 2012 um 8:13 Uhr

  • Das wusste ich nicht. Auf diese Weise kann jedes Unionsmitglied initialisiert werden!

    – Zirkonimbo

    10. August 2012 um 8:23 Uhr

Benutzer-Avatar
Prof. Falken

Sie können es immer noch bei der Deklaration zuweisen, zum Beispiel so:

const union un a = {0};

Update: Diese Notation setzt die Erste der Gewerkschaftsmitglieder.

  • @R.MartinhoFernandes Das erste Mitglied. Formal, wenn Sie haben union un { short s; double d; }; union un a = {};Die Inhalte von d undefiniert sind (und falls a const ist, gibt es sowieso keine Möglichkeit, legal darauf zuzugreifen).

    – James Kanze

    10. August 2012 um 8:21 Uhr

  • @AmigableClarkKant Das ist falsch (es sei denn, sie haben in der letzten Version des C-Standards etwas geändert). In C90 ist die Union-Initialisierung immer das erste Mitglied. In C99 gibt es eine erweiterte Syntax (in C++ nicht vorhanden), um ein anderes Mitglied zu initialisieren, aber es gibt immer noch nur ein Mitglied, das initialisiert wird.

    – James Kanze

    10. August 2012 um 8:22 Uhr

  • @JamesKanze Soweit ich das anhand des Standards beurteilen kann, un a = {0}; bedeutet: Setze das erste Union-Member auf Null und setze die restlichen Union-Member so, als ob sie Statiken wären, dh setze sie auch auf Null/NULL.

    – Ludin

    10. August 2012 um 8:59 Uhr


  • @JamesKanze Ich denke, in der Praxis wird es funktionieren wie “alles auf Null setzen, dann das erste Mitglied auf 42 setzen”.

    – Ludin

    10. August 2012 um 10:44 Uhr

  • @AmigableClarkKant Sein Zitat (das zugegebenermaßen nicht genau ist und ich den genauen Wortlaut nicht zur Hand habe) lautet: „Setzen Sie das erste Gewerkschaftsmitglied auf [the value given]und setzen Sie den Rest der Unionsmitglieder so, als wären sie statisch”. Wenn Sie schreiben un a { 42 };mit meiner Definition von undas bedeutet Einstellung s bis 42 und dann einstellen d zu 0.0. Da der Text für geschrieben wurde struct, es wird keine Reihenfolge erwähnt, aber zumindest wäre es legal, sie in der Reihenfolge festzulegen. Und wenn Sie setzen d dann auf 0 s wird nicht 42.

    – James Kanze

    10. August 2012 um 15:15 Uhr

1380270cookie-checkWozu dient ein konstantes Union-Objekt?

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

Privacy policy