136

ANSIntegerは、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:]ます。

4

3 に答える 3

304

更新された回答:

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

符号付き、符号なし、および16 進数に使用%zdします。%tu%tx

この情報はGreg Parkerの厚意によるものです。


元の答え:

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

于 2010-12-10T02:04:39.897 に答える
0

フォーマッタは、標準の UNIX/POSIX printf 関数から来ています。unsigned longには%lu、 longには %ld、long long には %lld、unsigned long longには%lluを使用します。コンソールで man printf を試しますが、Mac では不完全です。Linux のマンページはより明示的ですhttp://www.manpages.info/linux/sprintf.3.html

両方の警告は、NSLog(@"%lu", (unsigned long)arg); によってのみ修正できます。コードはiOS用に32ビットと64ビットでコンパイルされるため、キャストと組み合わせます。そうしないと、コンパイルごとに個別の警告が作成されます。

于 2014-12-16T11:18:10.913 に答える