এনএসআইএনজিটারের জন্য এনএসএলগ / প্রিন্টফ স্পেসিফায়ার?


131

NSInteger32-বিট প্ল্যাটফর্মগুলিতে 32 বিট, এবং 64-বিট প্ল্যাটফর্মগুলিতে 64 বিট its এমন কোনও NSLogনির্দিষ্টকরণ রয়েছে যা সর্বদা আকারের সাথে মেলে NSInteger?

সেটআপ

  • এক্সকোড 3.2.5
  • llvm 1.6 সংকলক (এটি গুরুত্বপূর্ণ; জিসিসি এটি করে না)
  • 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স্পেসিফারটি ব্যবহার করি তবে আমি %ldপরিবর্তে ব্যবহার করার জন্য bit৪ বিটের জন্য সংকলন করার সময় আমি একটি সতর্কতা পাই ।

যদি আমি %ldbit৪ বিট আকারের সাথে মেলে ব্যবহার করি , 32 বিট কোডের জন্য সংকলন করার সময় আমার %dপরিবর্তে আমি ব্যবহার করার পরামর্শ দিচ্ছি warning

আমি উভয় সতর্কতা একবারে কীভাবে ঠিক করব? আমি যে কোনও স্পেসিফায়ার ব্যবহার করতে পারি তা কি কাজ করে?

এটি প্রভাবিত করে [NSString stringWithFormat:]এবং [[NSString alloc] initWithFormat:]

উত্তর:


296

আপডেট উত্তর:

আপনি সমস্ত আর্কিটেকচারে এবং সতর্কতা ছাড়াই পরিচালনা করতে zও পরিবর্তনকারীদের ব্যবহার করতে পারেন ।tNSIntegerNSUInteger

আপনি %zdস্বাক্ষরযুক্ত, %tuস্বাক্ষরবিহীন এবং হেক্সের জন্য ব্যবহার করতে চান %tx

এই তথ্যটি গ্রেগ পার্কারের সৌজন্যে আসে ।


আসল উত্তর:

সরকারী প্রস্তাবিত পদ্ধতির ব্যবহার করা %ldআপনার সুনির্দিষ্টভাবে উল্লেখ করা হয়, এবং একটি প্রকৃত যুক্তি কাস্ট করার জন্য long


6
এটি অবশ্যই যাওয়ার উপায়, তবে আমি মনে করি আমি এটি ব্যবহার করতে পারি static inline NSIntToLong(NSInteger i) {return (long)i;}। এটি সম্পূর্ণরূপে চেকিং অক্ষম করা এড়িয়ে চলে (যেমন i এর ধরণের পরিবর্তন হয়)।
স্টিভেন ফিশার

3
@ স্টিভেন-ফিশার দ্বারা ভাল চিন্তাভাবনা। এর সাথে সতর্কতা static inline long NSIntToLong(NSInteger i) {return (long)i;}
এরিক

3
আপনি একটি এনএস নাম্বার তৈরি করতে এবং লগ করতে পারেন। NSLog(@"%@",@(mynsint)); stackoverflow.com/questions/20355439/...
orkoden

2
@ কেভিনবালার্ড এটি কোনও গুরুতর পারফরম্যান্সের সমস্যা হওয়া উচিত নয়। আপনার যাইহোক প্রডাকশন কোডে প্রচুর এনএসএলগ ব্যবহার করা উচিত নয়। যদি কোনও কারণে আপনাকে প্রচুর স্টাফ লগ করতে হয় তবে এটি একটি পৃথক থ্রেডে করুন।
orkoden

4
এক্সকোড 9.3 হিসাবে একটি সতর্কতা রয়েছে যখন এনএসআইন্টেগারটি ফর্ম্যাট আর্গুমেন্ট হিসাবে এটি ব্যবহার করে %zd:Values of type 'NSInteger' should not be used as format arguments; add an explicit cast to 'long' instead
রব ম্যাকএচারন

2

গৃহীত উত্তরটি একেবারে যুক্তিসঙ্গত, এটি আদর্শ অনুসারে এবং সঠিক। একমাত্র সমস্যা হ'ল এটি আর কাজ করে না, যা সম্পূর্ণ অ্যাপলের দোষ।

% Zd ফর্ম্যাটটি সাইজ_টি এবং সাইজ_টি এর জন্য সি / সি ++ স্ট্যান্ডার্ড ফর্ম্যাট। NSInteger এবং NSUInteger এর মত, আকার_t এবং ssize_t 32 বিট সিস্টেমে 32 বিট, এবং 64 বিট সিস্টেমে 64 বিট are এবং এজন্য% zd ব্যবহার করে NSInteger এবং NSUInteger মুদ্রণ কাজ করেছে।

যাইহোক, এনএসআইন্টেজার এবং এনএসইউইন্টারকে একটি 64 বিট সিস্টেমে "লং" এবং 32 বিট সিস্টেমে "ইন্ট" হিসাবে সংজ্ঞায়িত করা হয় (যা 64 বনাম 32 বিট হয়)। আজ, size_t সব সিস্টেমে "লম্বা" এ সংজ্ঞায়িত করা হয়, যা হয় NSInteger (হয় 64 বা 32 বিট) হিসাবে একই আকার, কিন্তু একটি ভিন্ন ধরনের। হয় অ্যাপলের সতর্কতাগুলি পরিবর্তিত হয়েছে (সুতরাং এটি বিটগুলির সঠিক সংখ্যা থাকা সত্ত্বেও এটি ভুল প্রিন্টটিকে প্রিন্টফায় যেতে দেয় না), বা আকার_আটি এবং সাইজ_এটের অন্তর্নিহিত প্রকারগুলি পরিবর্তিত হয়েছে। কোনটি আমি জানি না, তবে% zd কিছুক্ষণ আগে কাজ বন্ধ করে দিয়েছে। আজ এমন কোনও ফর্ম্যাট নেই যা 32 এবং 64 বিট উভয় সিস্টেমে সতর্কতা ছাড়াই এনএসআইন্টার প্রিন্ট করবে।

সুতরাং দুর্ভাগ্যক্রমে কেবলমাত্র আপনি যা করতে পারেন:% ld ব্যবহার করুন এবং আপনার মানগুলি NSInteger থেকে দীর্ঘ, অথবা NSUInteger থেকে স্বাক্ষরবিহীন দীর্ঘতে কাস্ট করুন।

একবার আপনি 32 বিটের জন্য তৈরি না করে, আপনি কোনও কাস্ট ছাড়াই কেবল% ld ব্যবহার করতে পারেন।


0

বিন্যাসগুলি স্ট্যান্ডার্ড ইউনিক্স / পসিক্স প্রিন্টফ ফাংশন থেকে আসে। ব্যবহারের % lu টি জন্য স্বাক্ষরবিহীন দীর্ঘ , দীর্ঘ জন্য% LD, দীর্ঘ দীর্ঘ জন্য% lld এবং % llu জন্য স্বাক্ষরবিহীন দীর্ঘ দীর্ঘ । কনসোলে ম্যান প্রিন্টফ চেষ্টা করে দেখুন, তবে ম্যাকের ক্ষেত্রে এটি অসম্পূর্ণ। লিনাক্স ম্যানাপেজগুলি আরও সুস্পষ্ট http://www.manpages.info/linux/sprintf.3.html

উভয় সতর্কতা কেবলমাত্র এনএসএলগ (@ "% লু", (স্বাক্ষরযুক্ত স্বাক্ষরিত) দীর্ঘায়িত) দ্বারা স্থির করা যাবে; একটি কাস্টের সাথে সংযুক্ত হিসাবে আইওএসের জন্য 32 এবং 64 বিটে সংকলন করা হবে। অন্যথায় প্রতিটি সংকলন পৃথক সতর্কতা তৈরি করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.