A 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).