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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als nach der
C99: 6.3.2.3
Zitat:Laut der Dokumentation auf der link Sie erwähnt:
Und weitere mehr
lang
ist garantiert mindestens 32-bit.So,der code
ist sicherer,mobiler und gut definiert für bis zu 32-bit-Ganzzahlen nur, wie angekündigt, die von GLib.
long
sicherer ist und mehr tragbar?long
ist garantiert mindestens 32-bit. Also es gibt keine Größe mismatch auf Systemen, auf denen GLib ausgeführt werden. In der Erwägung, dassint
ist nicht garantiert, dass 32-bit.Ich denke, es ist, weil diese Umwandlung ist die Umsetzung-dependendent. Es ist besser, verwenden Sie
uintptr_t
für diesen Zweck, weil es von der Größe des Zeiger-Typs in bestimmten Implementierung.size_t
ist eine vorzeichenlose integer-Typ vorgesehen, um zu halten die maximale Größe eines Objekts, nicht die Größe eines Zeigers.uintptr_t
ist eine vorzeichenlose integer-Typ vorgesehen, um zu halten die Darstellung eines Zeigers, und seine Existenz in der standard zeigt sich, dasssize_t
ist das nicht.