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
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
13802700cookie-checkWozu dient ein konstantes Union-Objekt?yes
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 seinconst 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