Alternativen zu type-casting, wenn die Formatierung NS(U)Integer auf 32-und 64-bit-Architekturen?

Mit der 64 bit version von iOS, wir können nicht %d und %u mehr format NSInteger und NSUInteger. Denn für 64 bit-die sind typedef würde long und unsigned long statt int und unsigned int.

Also Xcode wirft Warnungen, wenn Sie versuchen, format NSInteger mit %d.... Xcode ist nett zu uns und bietet einen Ersatz für diesen zwei Fällen, die aus einem l-Präfix-format-Bezeichner und eine Typumwandlung zu lange. Dann ist unser code sieht im Grunde so:

NSLog(@"%ld", (long)i);
NSLog(@"%lu", (unsigned long)u);

Welche, wenn Sie mich Fragen, ist ein Schmerz im Auge.

Vor ein paar Tagen jemand bei Twitter erwähnte der Formatbezeichner %zd format signed-Variablen und - %tu format unsigned Variablen auf 32-und 64-bit-Plattformen.

NSLog(@"%zd", i);
NSLog(@"%tu", u);

Scheint zu funktionieren. Und die mag ich mehr als typecasting.

Aber ich habe ehrlich gesagt keine Ahnung, warum diese Arbeit. Jetzt beide sind im Grunde Magische Werte für mich.

Ich habe ein wenig Forschung und fand heraus, dass die z Präfix bedeutet, dass die folgenden Formatbezeichner hat die gleiche Größe wie size_t. Aber ich habe absolut keine Ahnung, was das Präfix t bedeutet. Also ich habe zwei Fragen:

Was genau %zd und %tu bedeuten?

Und ist es sicher zu verwenden %zd und %tu anstelle der Äpfel Vorschlag zur Typumwandlung zu lange?


Ich bin mir bewusst, ähnliche Fragen und Apples 64-Bit-Übergang-Führungen, die allen empfehlen, die %lu (unsigned long) Ansatz. Ich Frage für eine alternative zum type-casting.

  • Was ist mit @"%i". Ich denke, dass es funktionieren wird)
  • %i entspricht genau %d und hier nicht helfen. Leider gibt es keine format-specifier für NS(U)Integer.
Schreibe einen Kommentar