%d格式化为32位和64位

ohh*_*hho 10 macos xcode objective-c ios

NSInteger precedence = [self operatorPrecedence];
[d appendFormat:@"precedence:%d, ", precedence];
Run Code Online (Sandbox Code Playgroud)

得到:

警告:Format指定类型'int'但参数的类型为'NSInteger'(又名'long')

和Xcode建议%d改为%ld.

但是,它仅适用于32位 64位目标,如下所示NSInteger:

 #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
Run Code Online (Sandbox Code Playgroud)

对于32位和64位目标,杀死警告的最佳方法是什么?

Kur*_*vis 12

按照Apple的64位过渡指南中的说明进行操作.

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

[d appendFormat:@"precedence:%ld, ", (long)precedence];
Run Code Online (Sandbox Code Playgroud)