objective-c - NSInteger 的 NSLog/printf 说明符?

NSInteger 在 32 位平台上是 32 位,在 64 位平台上是 64 位。是否有一个总是匹配 NSInteger 大小的 NSLog 说明符?

设置

  • 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:]

最佳答案

更新答案:

您可以使用 zt 修饰符来处理 NSIntegerNSUInteger 而不会出现警告,on所有架构。

您想将 %zd 用于已签名,%tu 用于未签名,%tx 用于十六进制。

此信息由 Greg Parker 提供.


原答案:

official recommended approach是使用 %ld 作为说明符,并将实际参数转换为 long

https://stackoverflow.com/questions/4405006/

相关文章:

objective-c - 使用 ARC 时是否在 dealloc 中将属性设置为 nil?

iphone - 如何将图像保存到相机胶卷?

objective-c - RootViewController 切换过渡动画

iphone - 如何自动调整 UIScrollView 的大小以适合其内容

ios - Xcode/模拟器 : How to run older iOS version?

ios - 将参数传递给 addTarget :action:forControlEvents

ios - 以编程方式触发按钮单击事件?

objective-c - 检测 NSString 是否包含...?

iphone - 如何获取 UIImage 并给它一个黑色边框?

iphone - iPhone 上 NSString 的 AES 加密