Cast int nach Zeiger - warum casten zu lange erste? (wie in p = (void*) 42; )

In der GLib Dokumentation gibt es ein Kapitel über die Typ-Konvertierung von Makros.
In der Diskussion über die Umwandlung eines int zu einem *void Zeiger, er sagt (Hervorhebung von mir):

Naiv, Sie könnten versuchen, diese, aber es ist falsch:

gpointer p;
int i;
p = (void*) 42;
i = (int) p;

Wieder, das Beispiel war nicht richtig, nicht kopieren. Das problem ist
dass auf einigen Systemen müssen Sie dies tun:

gpointer p;
int i;
p = (void*) (long) 42;
i = (int) (long) p;

(Quelle: GLib Reference Manual für GLib 2.39.92, Kapitel Typ-Konvertierung Makros ).

Warum ist das cast zu long notwendig?

Sollten alle erforderlichen Verbreiterung der int nicht automatisch als Teil des cast auf einen Zeiger?

  • Ich denke, dass da ein int kann 16-bit, während eine lange, mindestens 32bit Sie bekommen vielleicht 16 undefined bits, wenn Sie es umwandeln von int direkt. Dann aber auf einem 64bit-Maschine, lange könnte noch 32bit während ein Zeiger hätte Größe 64bit, immer das gleiche Problem (wenn es überhaupt existiert).
  • Zeichen-Erweiterung?
  • Casting-integer-Typen Zeiger wird durch die Implementierung festgelegt, was bedeutet, dass ein konformer compiler muss genau dokumentieren, was hier passiert. Es wäre schön, wenn der Autor dieses Zitats angegeben, welche Systeme erforderlich, die long cast (und noch schöner, wenn Sie mied diese Technik ganz, da gibt es zuverlässigere alternativen)
  • durch zuverlässige alternativen du meinst uintptr_t oder?
  • Ja, das wäre eine (oder intptr_t)
  • Wenn Sie konvertieren wollen wieder den Zeiger auf den gleichen Typ, im Gegensatz zu einem breiter Typ, kümmert man sich nicht, wie es ist "extended" solange die Konvertierung von Zeiger auf einen schmalen Typ integer hält nur das am wenigsten signifikante bit (das ist das übliche Verhalten). Da gibt es nicht einmal eine Anspielung auf die Art compiler, der definieren würde diese Konvertierungen so wie ärger, muss ich davon ausgehen abergläubischen Unsinn auf den Teil der glib Autoren.
  • developer.gnome.org/glib/stable/glib-Basic-Types.html, ich rest mein Fall. Dies ist das Werk von einer person oder Personen, die nicht verstehen, was Sie versuchen zu bieten einen compatibility-layer für. #define G_MINFLOAT FLT_MIN für "den minimalen positiven Wert, der gehalten werden kann, eine gfloat" ist schlicht falsch. Noch wichtiger ist, nicht eine einzige definition ist nützlich, wenn Sie einen C99-compiler, und nur wenige, die Kompatibilität mit C90.

InformationsquelleAutor sleske | 2014-08-19
Schreibe einen Kommentar