NSInteger的NSLog / printf说明符?
NSInteger
在32位平台上是32位,在64位平台上是64位。 是否有NSLog
说明符总是匹配的NSInteger
的大小?
build立
- 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:]
。
更新回答:
使用当前的Xcode,您可以在所有体系结构上使用z
和t
修饰符来处理NSInteger
和NSInteger
,而不会出现警告。
您希望使用%zd
签名, %tu
使用unsigned, %tx
使用hex。
这些信息是由Greg Parker提供的。
原始答案:
官方推荐的方法是使用%ld
作为说明符,并将实际参数强制转换为long
。
格式化程序来自标准的UNIX / POSIX printf函数。 长符号使用%lu , 长符号使用% ld,长符号使用% lld, 无符号长符号使用 %llu 。 尝试在控制台上的人printf,但在Mac上是不完整的。 linux的man页面更加明确http://www.manpages.info/linux/sprintf.3.html
这两个警告只能由NSLog(@“%lu”,(unsigned long)arg)修复; 结合一个强制转换的代码将被编译为32位和64位的iOS。 否则每个编译都会创build一个单独的警告。