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,您可以在所有体系结构上使用zt修饰符来处理NSIntegerNSInteger ,而不会出现警告。

您希望使用%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一个单独的警告。