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:]
ます。
static inline NSIntToLong(NSInteger i) {return (long)i;}
。これにより、タイプチェックが完全に無効になるのを回避できます(つまり、iのタイプが変更された場合)。