NSInteger
在 32 位平台上是32位,在 64 位平台上是64位。是否有一个NSLog
的说明符总是与 NSInteger
的大小匹配?
设置
- 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:]
。
static inline NSIntToLong(NSInteger i) {return (long)i;}
。这样可以避免完全禁用类型检查(即如果 i 的类型发生更改)。 - Steven Fisherstatic inline long NSIntToLong(NSInteger i) {return (long)i;}
- ErikNSLog(@"%@",@(mynsint));
详情请见:https://dev59.com/nmIj5IYBdhLWcg3wWT6c - orkoden%zd
作为格式参数时,如果使用NSInteger
类型,会收到一条警告:Values of type 'NSInteger' should not be used as format arguments; add an explicit cast to 'long' instead
。建议添加一个显式强制类型转换为long
。 - Rob MacEachern