Wozu braucht man solche Typedefs?
-
Hallo,
ich bin Anfänger und habe einen Quellcodeteil vor mir, womit ich überhaupt nichts anfangen kann. Vielleicht kann mir jemand deuten was es auf sich hat:
typedef bool Tbool; typedef char Tint8; // 1 Byte typedef unsigned char Tuint8; typedef long Tint32; typedef long long Tint64; typedef float Tfloat; typedef double Tdouble;
-
Du machst die dir am Anfang und kannst sie dann konsistent im Programm benutzen. Wenn du statt float dann lieber double hättest, änderst du einfach die typedef einmalig am Anfang statt dir alles Vorkommen im Quelltext suchen zu müssen ... zum Beispiel (hab ich noch nie benötigt, wäre aber eine Mögliche Begründung). Ansonsten hauen die Bezeichner schon nicht hin wenn du auf 64bit kompilierst da einige der Sachen dann eben nicht mehr von der Biotzahl her stimmen...
-
Also ich brauche typedefs hin und wieder um lange Typennamen abzukürzen.
Für solche langen Typen zum Beispiel (ist jetzt nicht das perfekte Beispiel):
typedef boost::shared_ptr<MyClass> myClass;Was das oben soll weiss ich nicht genau. Woher hast du den diesen Quellcode?
Mein Tipp:
Sehr sparsam mit typedefs umgehen... die können aus meiner Sicht den Code sehr mühsam zum lesen machen.
-
padreigh schrieb:
Ansonsten hauen die Bezeichner schon nicht hin wenn du auf 64bit kompilierst da einige der Sachen dann eben nicht mehr von der Biotzahl her stimmen...
Ist denn nicht ein long mindestens 32bit groß?
-
anfänger01 schrieb:
ich bin Anfänger und habe einen Quellcodeteil vor mir, womit ich überhaupt nichts anfangen kann. Vielleicht kann mir jemand deuten was es auf sich hat:
typedef bool Tbool; typedef char Tint8; // 1 Byte typedef unsigned char Tuint8; typedef long Tint32; typedef long long Tint64; typedef float Tfloat; typedef double Tdouble;In diesem speziellen Fall halte ich die Typedefs eher für sinnfrei. Besonders
typedef char Tint8;. Ich vermisse da einsignedvorchar. Es gibt nämlich 3 Character-Typen, char, signed char und unsigned char, wobei char entweder vorzeichenbehaftet oder vorzeichenlos ist. Das Rechnen mit char sollte man daher vermeiden.Und sonst kann man sich das Leben mit typedefs leichter machen:
int main() { typedef std::map<std::string,std::string> stringmap; stringmap sm; sm["greeting"] = "hello, anfaenger01!"; stringmap::iterator it = sm.begin(); cout << it->second << '\n'; }Statt std::mapstd::string,std::string kann nach dem typedef stringmap als Typ verwendet werden. Das kommt auf's gleiche raus...
kk
-
blue-tec schrieb:
Ist denn nicht ein long mindestens 32bit groß?
Ja schon, aber:
sizeof(type) liefert bei mir (linux64bit)
bool 1 char 1 unsigned char 1 long 8 long long 8 float 4 double 8typedef long Tint32; typedef long long Tint64;..also suggerieren die Bezeichner zT weniger als sie dann sind ...
-
icarus2 schrieb:
Was das oben soll weiss ich nicht genau. Woher hast du den diesen Quellcode?
Ist ein Programm dessen Code nicht öffentlich gestellt ist.
Könnte es sein, dass man damit je nach Zielsystem 32/64bit die Größen anpasst um die Grenzen konstant zu halten?Muss ich so etwas machen wenn ich Plattform unabhängig bleiben möchte?
-
Deswegen könnte er ja immer das Minimum gemeint haben.
-
anfänger01 schrieb:
Könnte es sein, dass man damit je nach Zielsystem 32/64bit die Größen anpasst um die Grenzen konstant zu halten?
Muss ich so etwas machen wenn ich Plattform unabhängig bleiben möchte?
Genau. Das ist so der übliche Weg, wie das gemacht wird. Es konzentrieren sich dann die plattformabhängigen Änderungen in einem einzigen File und nicht auf das gesamte Projekt. Somit muss nur diese eine Datei geändert und angepasst werden, dass die Typen stimmen und der Rest ist dann automatisch korrekt.
-
padreigh schrieb:
blue-tec schrieb:
Ist denn nicht ein long mindestens 32bit groß?
Ja schon, aber:
sizeof(type) liefert bei mir (linux64bit)
bool 1 char 1 unsigned char 1 long 8 long long 8 float 4 double 8typedef long Tint32; typedef long long Tint64;..also suggerieren die Bezeichner zT weniger als sie dann sind ...
Das ist ein Bug.