Ios %32位和64位的d格式

Ios %32位和64位的d格式,ios,objective-c,xcode,macos,Ios,Objective C,Xcode,Macos,给出: 警告:格式指定类型“int”,但参数的类型为 “NSInteger”(又名“long”) Xcode建议将%d更改为%ld 但是,它仅适用于32位或64位目标,因为NSInteger是: NSInteger precedence = [self operatorPrecedence]; [d appendFormat:@"precedence:%d, ", precedence]; 对于32位和64位目标,消除警告的最佳方法是什么 对于NSInteger,使用%ld并将值强制转换为lo

给出:

警告:格式指定类型“int”,但参数的类型为 “NSInteger”(又名“long”)

Xcode建议将
%d
更改为
%ld

但是,它仅适用于32位或64位目标,因为
NSInteger
是:

NSInteger precedence = [self operatorPrecedence];
[d appendFormat:@"precedence:%d, ", precedence];
对于32位和64位目标,消除警告的最佳方法是什么

对于
NSInteger
,使用
%ld
并将值强制转换为
long

 #if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
 typedef long NSInteger;
 typedef unsigned long NSUInteger;
 #else
 typedef int NSInteger;
 typedef unsigned int NSUInteger;
 #endif
试试这个

UPD:

[d appendFormat:@"precedence:%ld, ", (long)precedence];

如果您只支持10.8及更高版本,您甚至不必为32位编译(32位计算机无法运行10.8)。代码在OS X和iOS上运行。%ld不强制转换将使Xcode 5.1中的警告静音。安全吗?这将截断64位中的某些值,因为
NSInteger
是64位类型,而
int
仅为32位。
NSInteger precedence = [self operatorPrecedence];
[d appendFormat:@"precedence:%ld, ", (long)precedence];