objective c - NSLog/printf محدد لـ NSInteger؟




objective-c cocoa (2)

إن NSInteger هو 32 بت على منصات 32 بت ، و 64 بت على منصات 64 بت. هل هناك محدد NSLog يطابق دائمًا حجم NSInteger ؟

اقامة

  • Xcode 3.2.5
  • مترجم 1.6 llvm (وهذا أمر مهم ؛ لا يفعل مجلس التعاون الخليجي هذا)
  • 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 bit ، أحصل على تحذير يشير إلى أنني أستخدم %d بدلاً من ذلك.

كيف أقوم بإصلاح كل من التحذيرات دفعة واحدة؟ هل هناك محدد يمكنني استخدامه يعمل على أي منهما؟

هذا أيضاً يؤثر على [NSString stringWithFormat:] و [[NSString alloc] initWithFormat:] .


إجابة محدثة:

مع Xcode الحالي ، يمكنك الاستفادة من المعدلات z و t للتعامل مع NSInteger و NSUInteger دون تحذيرات ، على جميع البنى.

أنت تريد استخدام %zd للتوقيع ، و %tu غير الموقّع ، و %tx للعرافة.

هذه المعلومات تأتي مجاملة من جريج باركر .

الجواب الأصلي:

النهج الرسمي الموصى به هو استخدام %ld ، ولإظهار الوسيطة الفعلية long .


تأتي التنسيقات من دالة print / UNIX / POSIX القياسية. استخدم ٪ lu لفترة طويلة بدون تسجيل ،٪ ld لمدة طويلة ،٪ lld لفترة طويلة ، و ٪ llu لوقت طويل بدون توقيع . جرّب استخدام printf على وحدة التحكم ، ولكن على Mac غير مكتمل. تعتبر صفحات linux أكثر وضوحًا http://www.manpages.info/linux/sprintf.3.html

لا يمكن إصلاح كل من التحذيرات إلا بواسطة NSLog (@ "٪ lu" ، (غير موقعة طويلة)) ؛ جنبا إلى جنب مع يلقي كما سيتم جمع التعليمات البرمجية في 32 و 64 بت لنظام التشغيل iOS. وإلا ، فإن كل تصنيف ينشئ تحذيرًا منفصلاً.





nsinteger