Kompilieren des Codes meiner iOS-Anwendung für arm64 Ich sah ein interessantes Problem, das sich auf verschiedene Basistypen für benutzerdefinierte Foundation-Typen bezog. Angenommen, ich möchte printf (oder stringWithFormat) als NSUInteger
deklarieren %Vor%Dies wird eine Warnkompilierung für arm64 erzeugen, weil NSUInteger für arm64 als unsigned long deklariert wurde. Daher sollte ich "% u" durch "% lu" ersetzen, aber jetzt wird dies beim Kompilieren für armv7 (s) -Architektur ungültig, weil NSUInteger für 32-Bit-Architekturen als unsigned int deklariert wurde. Ich bin mir bewusst, dass die Warnung sagt, dass "NSUInteger nicht als Format-Argument verwendet werden sollte" , also gehen wir zu floats:
%Vor%bei 64-Bit CGFLOAT_TYPE ist doppelt , während es bei 32-bit float ist. Daher tun Sie etwas wie folgt:
%Vor%und dann
%Vor%Wird beim Kompilieren für zwei Architekturen immer noch eine Warnung ausgeben. Auf 32-Bit-Architektur ist der zweite Aufruf nicht korrekt (Konvertierung von Double in Float), bei der 64-Bit-Architektur konvertiert der erste Float in Double (was in Ordnung ist, aber immer noch nicht gut).
Würde gerne Ihre Gedanken zu diesem Problem hören.
Ein (zugegebenermaßen schrecklicher) Ansatz, den ich gesehen habe, ist, die Magie von #define
zu verwenden und die String-Literal-Verkettung zu kompilieren. So:
Ziemlich schrecklich, aber es funktioniert.
Ein anderer, scheinbar üblicherer Ansatz besteht darin, den Wert auf jeder Plattform einfach auf den größeren Typ hochzustufen:
%Vor%In jüngerer Zeit (d. h. seit die neue Box-Kürzel-Syntax herauskam) habe ich festgestellt, dass ich faul bin und angefangen habe, einfach alles zu boxen, so:
%Vor%Es mag einen besseren Weg geben, aber das sind diejenigen, die ich am meisten gesehen habe.
Tags und Links c objective-c ios types printf