NSInteger の NSLog/printf 指定子? 質問する

NSInteger の NSLog/printf 指定子? 質問する

A はNSInteger、32 ビット プラットフォームでは 32 ビット、64 ビット プラットフォームでは 64 ビットです。NSLogのサイズと常に一致する指定子はありますかNSInteger?

設定

  • Xcode 3.2.5
  • llvm 1.6 コンパイラ(これは重要です。gcc はこれを行いません)
  • GCC_WARN_TYPECHECK_CALLS_TO_PRINTFオン

それは私に少し悲しみをもたらしています:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    @autoreleasepool {
        NSInteger i = 0;
        NSLog(@"%d", i);
    }
    return 0;
}

32 ビット コードの場合、指定子が必要です%d。ただし、%d指定子を使用すると、64 ビット用にコンパイルするときに、代わりに を使用するように勧める警告が表示されます%ld

64 ビット サイズに一致させるためにを使用すると%ld、32 ビット コード用にコンパイルするときに、代わりに を使用することを提案する警告が表示されます%d

両方の警告を一度に修正するにはどうすればよいですか? どちらにも機能する指定子はありますか?

これは および にも影響し[NSString stringWithFormat:]ます[[NSString alloc] initWithFormat:]

ベストアンサー1

更新された回答:

zおよびt修飾子を使用すると、すべてのアーキテクチャで警告なしで および を処理できNSIntegerますNSUInteger

%zd符号付きの場合は 、%tu符号なしの場合は 、 16 進数の場合はを使用します%tx

この情報はグレッグ・パーカー


元の回答:

公式に推奨されるアプローチを指定子として使用し%ld、実際の引数を にキャストすることですlong

おすすめ記事