typedef in anonyme struct
-
Mal kurz betreffend deines letzten (angeblich richtigen) Codes:
Comeau:
"ComeauTest.c", line 3: error: declaration does not declare anything struct ^ "ComeauTest.c", line 10: error: declaration does not declare anything struct ^ "ComeauTest.c", line 22: error: class "foo" has no member "test1" f.test1 = 3; ^ "ComeauTest.c", line 23: error: class "foo" has no member "test2" f.test2 = 3; ^
gcc 3.3.2
test.cpp:9: error: ISO C++ prohibits anonymous structs test.cpp:16: error: ISO C++ prohibits anonymous structs
VC++ schluckt den Code aber - es sei denn man deaktiviert Language Extension
-
ISO C++ prohibits anonymous structs
das war das was ich wissen wollte...
hmmmm.... mal überlegen wie ich das standard konform hin bekomme...
-
Hallo,
erstmal musst du zwei Dinge unterscheiden: 1. unnamed types und 2. anonyme unions.
Ein unnamed type sieht so aus:struct { ... } obj;
Das obj ist ganz entscheidend. Ein unnamed type muss immer eine Instanz haben.
Eine anonyme Union hingegen sieht so aus:
union { ... };
Eine anonyme union hat *weder* einen Typnamen *noch* existiert davon ein Objekt.
Der C++ Standard erlaubt anonyme und unamed unions. Und er erlaubt unnamed structs, nicht aber anonyme structs.
Das heißt überall wo in deinem Code ein:
struct { ... };
auftaucht, ist kein legales C++ mehr drin.
-
Ok. Zu lange im Standard gelesen. Shade war schneller
-
also so schön langsam geht der rauch auf..
Wenn ich deinen post richtig interpertiere ist das hier dann c++ konform:
struct foo { union { typedef int structType; union { structType test1; }; }; };
schön und gut, ändert aber nichts am:
an anonymous union can only have non-static data members
gcc bug?
-
CMatt schrieb:
Wenn ich deinen post richtig interpertiere ist das hier dann c++ konform:
Nö ist es nicht. Anonyme unions dürfen weder Typen noch Funktionen deklarieren.
-
so, soll ich mich jetzt freuen das es doch keine gcc bug ist, oder weinen weil ich mir was anderes überlgen muss...
thx für die hilfe
-
wenn aber
union{ struct{ //hier ein paar variablen } struct{ //hier ein paar variablen } }
nicht erlaubt ist, welche anderen möglichkeiten hat der programmierer denn dann noch, das oben aufgeführte richtig und vorallem einfach darzustellen?
-
in c++ keine, du brauchst nen namen für die struct, unions, namespace, oder was immer du verwenden willst
-
Hallo,
sowas braucht man doch (wenn überhaupt) nur in Rand- und Spezialfällen. In Fällen, wo Portabilität sowieso bereits nebensächlich ist (die Beispiele die ich für diese Gebilde kennen haben meisten irgendwas mit Prozessoren und deren Registern zu tun). Wenn man also wirklich mal sowas braucht und alle alternativen Standardlösungen einem nicht zusagen, dann muss man halt einfach mal die entsprechende Compilererweiterung nutzen und den Pfad des Standards verlassen.
-
also ich brauchs relativ häufig, zwar nicht unbedingt mit 2 structs, aber bei der matritzen berechnung hab ich zb gerne erstmal die 16 felder einzeln, dann als 4x4 array und als 1*16 array
union{ struct{ float _11,_12,_13,_14; float _21,_22,_23,_24; float _31,_32,_33,_34; float _41,_42,_43,_44; }; float m[4][4]; float m2[16]; }
ohja, in der 3D vectorberechnung braucht man sowas auch^^
union{ struct{//Positionskoordinaten float x; float y; float z; }; struct{//Texturkoordinaten float u; float v; float w; }; };
-
Hallo,
warum nicht einfach so?struct Positionskoordinaten{ float x; float y; float z; }; struct Texturkoordinaten{ float u; float v; float w; }; static union{ Positionskoordinaten p; Texturkoordinaten t; };
Oder übersehe ich jetzt was wichtiges?
-
zb dass ich jetzt immer über den umweg von p.x gehen muss, und der code gleich gigantische 2 zeilen länger ist