scope in struct
-
hi!
Ich brauch mal wieder ein paar Vorschläge/Anregungen von euchKurzer Hintergrund zum Problem:
C Bitfields sind ja bekanntlich nicht platform protabel (wenn die über nen speicherblock auf nem Big- und Little Endian system liegen, kommt nicht das selbe raus). Ich versuche zur Zeit eine brauchbare Lösung für diese Problem zu finden. Die Lösung soll möglichst Idiotensicher und wenig Tipparbeit sein.Der derzeitige Status sieht so aus:
struct Foo { char m_bli; Bitfield(BigEndian<DWORD>) { BitRange(0,16) m_bla; BitRange(16,9) m_ble; BitRange(25,7) m_blu; } end_bitfield; }
Hier wurde nun eine 5 byte große struct definiert, die ein 4 Byte großese Bitfield enthält das sich wie ein BigEndian<DWORD> verhält.
(BigEndian<DWORD> ist ein template, das sich nach ausen wie ein DWORD verhält, aber je nach CPU die bytes swaps oder nicht)
Dahinter stecken makros, die aus dem ca. folgendes machen:struct Foo { char m_bli; union { typedef BITFIELDTYPE BigEndian<DWORD> union { BitRangeTmpl<BITFIELDTYPE,0,16> m_bla; BitRangeTmpl<BITFIELDTYPE,16,9> m_ble; BitRangeTmpl<BITFIELDTYPE,25,7> m_blu; }; }; };
Ist kein c++ (habn wir ja gestern geklärt
) wird aber vom VC++ trozdem geschuckt (typedef in anonyme union ist nicht erlaubt). Nach was ich nun suche ist ne C++ variante von dem ding.
Das Problem: Ich will nicht bei jedem BitRange den type noch mal extra angeben müssen, also hab ich das über ein typedef im Bitfield(..) makro gelöst (typedef BITFIELDTYPE BigEndian<DWORD>) und das darf man nicht... Nächste Möglichkeit wär den union (oder struct) nen namen zu geben, gefällt mir allerdings auch nicht, das es sehr oft vorkommt das zum Bitfield einfach keinen passenden namen gibt, da bit bitfelder direkt mit den anderen Variable zusammenhängen... und bei dem Einfallsreichtum den manche Leute bei der Namesgebung haben sehen ich dann schon die codezeilen:
Foo foo; foo._1.m_bit1; foo._1.m_bit2; foo._2.m_bit4;
vor mir.. unlesbar... mag ich net...
Also was ich brauche ist einfach einen scope innerhalb der struct, der die Gültikeit meines typedefs einschränkt, damit ich das nächste typedef im nächsten Bitfield nicht in die quere kommt.
Jemand ne Idee? Oder nen anderen Vorschlag? Das ding sollte sich nach ausen wie ein C bitfield bedienen lassen, möchst wenig Tiparbeit bei der deklaration (so auch weniger Fehleranfällig) sein, das wär das ziel.
danke schon mal