typedef in anonyme struct
-
achja.. hier was zum testen
:
struct foo { struct { typedef int structType; union { int test; }; }; }; int main() { return 0; }
-
struct { typedef int Int; } a;
ist legal.
Mein gcc (3.3.2) schluckt es auch.
@CMatt:
dein Code ist nicht korrekt:struct {/*whatever*/};
ist nicht erlaubt - es definiert weder einen typen, noch legt es eine variable an -> es tut nix. Deshalb ist es verboten.
-
es definiert weder einen typen, noch legt es eine variable an -> es tut nix
ermm... klar tut das was, das enthält ne union und ein typedef.
sinn von dem, es soll beliebig erweiterbar sein (der code wird über makros zusammenbaut).
struct foo { struct { typedef int structType; union { structType test1; }; }; struct { typedef char structType; union { structType test2; }; }; ... };
ich kann so also mehrere typedef ... structType; in foo haben, deren gültigkeit nur bis zum ende der struct reicht die nichts macht
-
Mein gcc (3.3.2) schluckt es auch.
den code den ich gepostet hab o_O
-
CMatt schrieb:
Mein gcc (3.3.2) schluckt es auch.
den code den ich gepostet hab o_O
nein, meinen code.
dein neuer Code liefert beim Comeau folgendes:
Comeau C/C++ 4.3.3 (Aug 6 2003 15:13:37) for ONLINE_EVALUATION_BETA1 Copyright 1988-2003 Comeau Computing. All rights reserved. MODE:strict errors C++ "ComeauTest.c", line 3: error: declaration does not declare anything struct ^ "ComeauTest.c", line 11: error: declaration does not declare anything struct ^ 2 errors detected in the compilation of "ComeauTest.c".
die struct macht nichts. du erstellst eine unnamed struct, von der keine variable angelegt wird. folglich kannst du damit nichts machen - wie willst sie denn verwenden?
-
wie willst sie denn verwenden?
so:struct foo { struct { typedef int structType; union { structType test1; }; }; }; int main() { foo f; f.test1 = 3; return 0; }
Also noch mal zur erinnerund, das unnamed struct ist nicht das problem.
Das hier frisst auch der gcc und alles andere was ich getestet hab:struct foo { struct { union { int test1; }; }; struct { union { char test2; }; }; }; int main() { foo f; f.test1 = 3; f.test2 = 3; return 0; }
Das gemekere kommt erst sobald ein typedef drinnen ist und ich mich würde interessieren warum...
-
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