Erstens, wenn Sie func
beheben können (darf seine Quelle ändern), dann reparieren Sie es. Wenn seine Berechnungen mit Zeigern durchgeführt werden können, dann machen Sie sie mit Zeigern und Zeigern zurück. Manchmal gibt es gute Gründe, mit Adressen als ganze Zahlen zu arbeiten (z. B. mit Ausrichtungsproblemen in einem speziellen Code umzugehen). Ändern Sie in diesem Fall func
, um den Typ uintptr_t
(definiert in stdint.h
) zu verwenden. Es ist für die Behandlung von Zeigern als ganze Zahlen ausgelegt, wenn dies erforderlich ist. (Es gibt auch intptr_t
, wenn arithmetische Vorzeichen aus irgendeinem Grund besser sind, aber ich finde im Allgemeinen die unsignierte uintptr_t
weniger problematisch.) Vorzugsweise sollte func
die uintptr_t
in einen Zeiger bei der Rückgabe konvertieren, so würde der Rückgabetyp von func
ein Zeiger sein (auf etwas, vielleicht some_struct
oder void
).
Wenn Sie func
nicht beheben können, können Sie mithilfe von Umwandlungen dem Compiler mitteilen, dass Sie die ausgeführten Konvertierungen ausführen möchten. Diese spezielle Fehlermeldung sagt Ihnen jedoch, dass Sie nicht nur eine ganze Zahl in einen Zeiger konvertieren, sondern dass Sie eine Ganzzahl einer Größe (z. B. vier Bytes) in einen Zeiger einer anderen Größe (z. B. acht Bytes) konvertieren. Es ist wahrscheinlich, dass dieser Code ursprünglich für ein System geschrieben wurde, in dem der von func
zurückgegebene Integer-Typ die gleiche Größe wie der Zeigertyp hatte, aber jetzt auf einem System kompiliert, bei dem der Zeigertyp größer oder kleiner als diese Ganzzahlgröße ist.
In diesem Fall müssen Sie sicherstellen, dass die von func
ausgeführte Berechnung in der neuen Architektur funktioniert. Wenn nur ein 32-Bit-Wert zurückgegeben wird, wird dieser immer den richtigen Wert enthalten? Das heißt, nichts wird durch die fehlenden hohen 32 Bits verloren gehen? Keine Adresse, die func
sollte jemals den Maximalwert des Integer-Typs, den es verwendet, berechnen? Wenn func
vorzeichenbehaftete Integer-Typen verwendet, berücksichtigen Sie auch das Vorzeichen-Bit. Wenn Sie sichergestellt haben, dass der von func
zurückgegebene Wert korrekt ist, können Sie explizite Umwandlungen verwenden, beispielsweise: some_struct *ptr = (some_struct *) (intptr_t) func();
.
Warum möchten Sie eine Ganzzahl in einen Struct-Zeiger einfügen? – Jay
Es ist möglich, aber die Fälle, in denen das der richtige Weg ist, sind selten. –
Überlastung der "Ausgabe" -Differenzen (nicht die Eingabeparameter) –