Anonyme struct und union legal?
-
Ist folgende Konstruktion legales C++?
struct foobar { union { struct { char a,b,c,d; }; int i; }; };
-
hm... weis net. aber ich habs auch schon öfters so gemacht

-
User--- schrieb:
struct { char a,b,c,d; };Declaration doesn't declare something. (oder so ähnlich)
Ein anonymes struct/union kann nicht alleine existieren, ohne dass Du ein Objekt anlegst. Wie würdest Du sonst auch darauf zugreifen wollen.
-
7H3 N4C3R schrieb:
Ein anonymes struct/union kann nicht alleine existieren, ohne dass Du ein Objekt anlegst.
Die Deklaration einer namenlosen union "ohne Objekt" deklariert ein Objekt.
-
Hmm stimmt... union ja. Aber struct? Ich meine nicht. Und struct in union auch nicht.
-
User--- schrieb:
Ist folgende Konstruktion legales C++?
struct foobar { union { struct { char a,b,c,d; }; int i; }; };Nein. Allein schon weil innerhalb einer anonymen Union keine udts deklariert werden dürfen. Siehe 9.5/2.
-
Ok, wäre auch zu schön gewesen

-
Gibts nen workaround für folgende Schreibweise:
foobar f;
f.uni.abcdWrap.a;
f.uni.i;damit man direkt f.a und f.i schreiben kann?
Bei folgendem Aufbau
struct abcdWrapper { char a,b,c,d; }; union abcdiMerger { abcdWrapper abcdWrap; int i; }; struct foobar { abcdiMerger uni; }
-
AFAIK nicht... was nicht heißen soll, dass es garnicht geht. Defines vielleicht
Referenzen?struct abcdWrapper { char a,b,c,d; }; union abcdiMerger { abcdWrapper abcdWrap; int i; }; struct foobar { private: abcdiMerger uni; public: char& a; char& b; char& c; char& d; int& i; foobar() : a(this->uni.abcdWrap.a), b(this->uni.abcdWrap.b), c(this->uni.abcdWrap.c), d(this->uni.abcdWrap.d), i(this->uni.i) }Keine Ahnung, ob das überhaupt gültig ist. Ist auch ziemlich pervers
und sehr leicht zerbrechlich, da einige semantische Feinheiten drin sind. Und mir scheint, als willst Du die Union zum Casten benutzen. Das ist verbotenDirekt aus dem Standard, 9.5, Clause 1:
In a union, at most one of the data members can be active at any time, that is, the value of at most one of
the data members can be stored in a union at any time.
-
Ja, hatte vor das zum casten zu verwenden. Habe derzeit bitshifts, so wäre es halt schneller. Aber wenn es verboten ist, dann kann ich auch beruhigt so leben.
Danke
