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
。