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

安装程序

  • Xcode 3.2.5
  • llvm 1.6编译器(this is important; gcc doesn't do this)
  • 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而不发出警告.

您希望使用%zd表示有符号,%tu表示无符号,%tx表示十六进制.

此信息由Greg Parker提供.


原始答案:

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

Objective-c相关问答推荐

核心数据独特属性

获取按其各自值排序的 NSDictionary 键

在 viewDidAppear 之前无法正确设置框架

NSMutableDictionary 线程安全

使用 UIViewControllerInteractiveTransitioning 委托协议实现自定义 UIViewController 交互式过渡的正确方法

iOS 内存分配 - 一个应用程序可以使用多少内存?

从 UIPageViewController 中移除视图控制器

UICollectionView 单元格 Select 和单元格重用

从 UIImage 获取 Exif 数据 - UIImagePickerController

UIWebView didFinishLoading 多次触发

如何在 Cocoa 中获取 NSArray 的第一个 x 元素?

Core Text在iOS中计算字母框架

无法在导航栏中心设置titleView,因为返回按钮

当 UIView 框架更改时,视图内的 AVPlayer 层不会调整大小

在 Objective-C 中计算两个日期之间的天数

如何在键盘上添加完成按钮?

最大 CGFloat 值是否有常数?

iPhone SDK:如何在视图中播放视频?而不是全屏

如何定义 UIColor 的常量值?

使用 [NSDate date] 获取当前日期和时间