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 змінюється).