NSInteger
在 32 位平台上是 32 位,在 64 位平台上是 64 位。是否有一个总是匹配 NSInteger
大小的 NSLog
说明符?
设置
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:]
。
最佳答案
更新答案:
您可以使用 z
和 t
修饰符来处理 NSInteger
和 NSUInteger
而不会出现警告,on所有架构。
您想将 %zd
用于已签名,%tu
用于未签名,%tx
用于十六进制。
此信息由 Greg Parker 提供.
原答案:
official recommended approach是使用 %ld
作为说明符,并将实际参数转换为 long
。
https://stackoverflow.com/questions/4405006/