2010-12-10 29 views
117

A NSInteger, 32 bit platformlarda 32 bit ve 64 bit platformlarda 64 bittir. Her zaman NSInteger boyutuna uyan bir NSLog belirteci var mı?NSLog/printf belirteci?

Kur

  • Xcode 3.2.5
  • LLVM 1.6 derleyici (bu önemli; gcc bu yapmaz)
  • GCC_WARN_TYPECHECK_CALLS_TO_PRINTF beni neden oluyor Yani

açık Burada biraz keder:

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) { 
    @autoreleasepool { 
     NSInteger i = 0; 
     NSLog(@"%d", i); 
    } 
    return 0; 
} 

32 bit kodu için %d belirticiye ihtiyacım var. Ancak %d belirtecini kullanırsam, 64 bit için derlerken %ld kullanıyorum.

32 bit kodu derlerken, %ld'u 64 bit boyutuna eşlemek için kullanırsam, bunun yerine %d kullandığımı gösteren bir uyarı alırım.

Her iki uyarıyı da aynı anda nasıl gideririm? Kullanabileceğim bir belirleyici var mı? Bu, ve [[NSString alloc] initWithFormat:] etkilerini de etkiler.

cevap

274

Güncelleme cevap: Geçerli Xcode ile

, sen z ve t değiştiricilerin kullanımı tüm mimariler üzerinde, bir uyarı olmadan NSInteger ve NSUInteger ele yapabilirsiniz.

İmzalı olarak %zd, imzasız için %tu ve hex için %tx kullanmak istiyorsunuz.

Bu bilgi Greg Parker izniyle karşılanır.


Orjinal cevap:

official recommended approach sizin belirteç olarak %ld kullanmak ve long gerçek argüman döküm etmektir.

+6

Bu kesinlikle gitmek için bir yoldur, ancak sanırım statik inline NSIntToLong (NSInteger i) {return (uzun) i;} 'kullanabilirim.Bu, tür denetiminin tamamen devre dışı bırakılmasını önler (örneğin, i türü değişirse). –

+3

@ steven-fisher tarafından iyi düşünmek. Uyarı: • Statik satır içi uzun NSIntToLong (NSInteger i) {return (uzun) i;} ' – Erik

+2

Ayrıca bir NSNumber oluşturabilir ve bunu kaydedebilirsiniz. NSLog (@ "% @", @ (mynsint)); 'http://stackoverflow.com/questions/20355439/nsinteger-and-nsuinteger-in-a-mixed-64bit-32bit-environment – orkoden

0

Biçimlendiriciler, standart UNIX/POSIX yazdırma işlevinden gelir. imzasız uzun uzun için imzasız uzun, uzun uzun uzun,% lld için% ld ve % llu için % lu kullanın. Konsolda adam printf'i deneyin, ancak Mac'de eksik. Linux man sayfaları daha açık http://www.manpages.info/linux/sprintf.3.html

Her iki uyarı da yalnızca NSLog ("% lu", (imzasız uzun) arg) tarafından düzeltilebilir; kod, iOS için 32 VE 64 bit olarak derleneceğinden bir yayınla birleştirilir. Aksi takdirde her derleme ayrı bir uyarı oluşturur.