0

当我尝试在 64 位模式下运行时,我得到的确切错误是Format specifies type 'int' but the argument has type 'long'.

%d我可以通过更改为来修复此错误%ld,但是当我在 32 位(正常)模式下运行应用程序时,我收到一条错误消息:Format specifies type 'long' but the argument has type 'int'

如何同时考虑 64 位和 32 位?我创建了一个 if(condition) 吗?

- (void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component {
    // Handle the selection

    if(pickerView.tag == 1){
        start = row+1;
        [startButton setTitle:[NSString stringWithFormat:@"%d. %@", row+1, [stops objectForKey:[NSString stringWithFormat:@"%d", row+1]]] forState:UIControlStateNormal];
    }else if (pickerView.tag == 2){
        stop = row+1;
        [endButton setTitle:[NSString stringWithFormat:@"%d. %@", row+1, [stops objectForKey:[NSString stringWithFormat:@"%d", row+1]]] forState:UIControlStateNormal];
    }
}
4

3 回答 3

0

如果您右键单击NSInteger,然后单击“转到定义”,您可以确切地看到它是如何#defined 并将其用作骨架来设置类似#define的 for %d/%ld以匹配您的NSInteger.


#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
#endif

这是如何NSInteger工作的。你可以做类似的事情:

#if __LP64__
#define FS_NSInt ld
#else
#define FS_NSInt d
#endif

然后只需将FS_NSInt其用作NSIntegers 的格式说明符。%(仍然在它前面放一个)

于 2013-11-06T00:36:07.587 回答
0

不要使用NSIntegerorNSUInteger作为格式参数。而是将它们转换为(例如long long

[NSString stringWithFormat:@"%lld", (long long)row+1]
于 2013-11-06T00:36:35.723 回答
0

来自苹果文档

类型说明符:

通常,在 32 位代码中,您使用 %d 说明符在 printf、NSAssert 和 NSLog 等函数以及 stringWithFormat: 等方法中格式化 int 值。但是对于 NSInteger,它在 64 位架构上的大小与 long 相同,您需要使用 %ld 说明符。除非您像 64 位一样构建 32 位,否则这些说明符会在 32 位模式下生成编译器警告。为避免此问题,您可以根据需要将值强制转换为 long 或 unsigned long。例如:

NSInteger i = 34;
printf("%ld\n", (long)i);

解决此问题的一种方法是使用 stdint.h 中的类型:
int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t

于 2013-11-06T00:50:01.543 回答