为什么NSInteger变量在用作格式参数时必须转换为Long?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)
NSInteger myInt = 1804809223;
NSLog(@"%i", myInt); <==== 

上面的代码产生一个错误:

Values of type "NSInteger" should not be used as format arguments: add an explicit cast to 'long' instead.

正确的NSLog消息实际上是NSLog(@"%lg", (long) myInt);为什么我必须将myInt的整数值转换为long,如果我希望显示该值?

提问于
用户回答回答于

如果在OS X(64位)上编译,则会得到此警告,因为在该平台NSInteger上定义为long64位整数。的%i格式,而另一方面,为int,这是32位的。所以格式和实际参数大小不匹配。

由于NSInteger是32位或64位,根据平台的不同,编译器建议long通常添加一个转换。

用户回答回答于

如果格式说明符符合你的数据类型,则不必投射任何东西。有关本机类型NSInteger被定义为的答案。

所以在OS X 64位上,你可以写下你的日志语句:

NSLog(@"%ld",  myInt); 

而在iOS上,可以编写:

NSLog(@"%d",  myInt); 

并且它将全部工作而不会施放。

无论如何,至少在非UI代码中使用强制转换的一个原因是好的代码倾向于跨平台移植,并且如果明确强制转换变量,它将在32位和64位上进行干净编译:

NSLog(@"%ld",  (long)myInt);

这也将帮助你的iOS代码过渡到64位,如果它曾经到iOS。或者当iOS和OS X合并在一起时。

注意,这不仅仅针对NSLog语句,毕竟它只是调试辅助工具,而且也是针对[NSString stringWithFormat:]作为生产代码合法元素的朋友。

扫码关注云+社区