Foundation-Typen beim Kompilieren für arm64- und 32-Bit-Architektur

8

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.

    
Serhii 17.09.2013, 11:31
quelle

1 Antwort

11

Ein (zugegebenermaßen schrecklicher) Ansatz, den ich gesehen habe, ist, die Magie von #define zu verwenden und die String-Literal-Verkettung zu kompilieren. So:

%Vor%

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.

    
ipmcc 17.09.2013 11:47
quelle

Tags und Links