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замість цього.
Якщо я використовую %ld64-бітовий розмір, під час компіляції 32-бітового коду я отримую попередження про те, що я використовую %dзамість цього.
Як виправити обидва попередження одночасно? Чи є специфікатор, яким я можу скористатися, який працює на будь-якому?
Це також впливає [NSString stringWithFormat:]і [[NSString alloc] initWithFormat:].
static inline NSIntToLong(NSInteger i) {return (long)i;}. Це дозволяє уникнути повного відключення перевірки типу (тобто якщо тип i змінюється).