1. ホーム
  2. objective-c

[解決済み] NSIntegerのNSLog/printf指定子?

2022-06-16 03:02:31

質問

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 を使うように警告が出ます。

もし私が %ld を使って 64 ビットのサイズに合わせると、32 ビットのコード用にコンパイルするときに、警告が表示されます。 %d を使用するようにという警告が表示されます。

どうすれば両方の警告を一度に修正できますか?どちらにも有効な指定子はありますか?

これはまた [NSString stringWithFormat:][[NSString alloc] initWithFormat:] .

どのように解決するのですか?

回答を更新しました。

を利用することができます。 zt を処理するための修飾子 NSIntegerNSUInteger を警告なしで、すべてのアーキテクチャで使用できます。

あなたは %zd を署名付きで使用したい。 %tu は符号なし、そして %tx は16進数用です。

この情報の提供元は グレッグ・パーカー .


オリジナルの回答です。

その 公式推奨アプローチ を使用することです。 %ld を指定子として使用し、実際の引数を long .