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代わりに使用するように提案されます。
%ld64ビットサイズと一致させるために使用する場合、32ビットコード用にコンパイルすると、%d代わりに使用することを示唆する警告が表示されます。
両方の警告を一度に修正するにはどうすればよいですか?どちらでも機能する指定子はありますか?
これも影響[NSString stringWithFormat:]し[[NSString alloc] initWithFormat:]ます。
static inline NSIntToLong(NSInteger i) {return (long)i;}。これにより、タイプチェックが完全に無効になるのを回避できます(つまり、iのタイプが変更された場合)。