আমি off_tএবং এর মতো প্রিন্ট প্রিন্ট করার চেষ্টা করছি size_t। printf() পোর্টেবলের জন্য সঠিক স্থানধারক কী ?
বা এই ভেরিয়েবলগুলি মুদ্রণের জন্য কি সম্পূর্ণ আলাদা উপায় আছে?
আমি off_tএবং এর মতো প্রিন্ট প্রিন্ট করার চেষ্টা করছি size_t। printf() পোর্টেবলের জন্য সঠিক স্থানধারক কী ?
বা এই ভেরিয়েবলগুলি মুদ্রণের জন্য কি সম্পূর্ণ আলাদা উপায় আছে?
উত্তর:
আপনি আকার_t zএবং tptrdiff_t এর মতো ব্যবহার করতে পারেন
printf("%zu %td", size, ptrdiff);
তবে আমার ম্যানপেজটি বলেছে যে কিছু পুরানো গ্রন্থাগার zএটির চেয়ে আলাদা চরিত্র ব্যবহার করেছে এবং এর ব্যবহারকে নিরুৎসাহিত করে। তবুও, এটি মানক করা হয়েছে (সি 99 স্ট্যান্ডার্ড দ্বারা)। তাদের জন্য intmax_tএবং int8_tএর stdint.hএবং তাই, সেখানে ম্যাক্রো আপনি ব্যবহার করতে পারেন, মত অন্য উত্তর বলেন আছেন:
printf("value: %" PRId32, some_int32_t);
printf("value: %" PRIu16, some_uint16_t);
এগুলির ম্যানপেজে তালিকাভুক্ত করা হয়েছে inttypes.h।
ব্যক্তিগতভাবে, আমি কেবল উত্তরগুলি প্রস্তাব করতে চাইলে unsigned longবা longপছন্দ করতে চাই। আপনি, তাহলে আপনি (এবং, অবশ্যই উচিত) এতে কাস্ট করতে পারেন C99 ব্যবহার করেন তাহলে unsigned long longবা long longএবং ব্যবহার %lluবা %lldযথাক্রমে ফরম্যাটের।
%zdএকটি সঙ্গে size_tহয় অনির্ধারিত আচরণ signedness মেলেনি (C99 7.19.6.1 # 9) কারণে। এটা অবশ্যই হবে %zu।
%zdসাথে size_tসংজ্ঞায়িত আচরণ হয়। প্রকৃতপক্ষে, %z# 7- এর সংজ্ঞাটি স্বাক্ষরযুক্ত প্রকারের %dসাথে size_tএবং স্বাক্ষরিত প্রকারের সাথে স্পষ্টভাবে অনুমতি দেয় এবং .26.2.5 # 9 স্বাক্ষরযুক্ত স্বাক্ষরিত প্রকারের প্রত্যাশিত যেখানে স্বাক্ষরিত প্রকারের প্রত্যাশা করা হয় ততক্ষণ স্পষ্টভাবে মঞ্জুরি দেয়, যতক্ষণ মানটি একটি বৈধ অবৈধ মান হিসাবে হয় স্বাক্ষরিত ধরণের।
মুদ্রণ করতে off_t:
printf("%jd\n", (intmax_t)x);
মুদ্রণ করতে size_t:
printf("%zu\n", x);
মুদ্রণ করতে ssize_t:
printf("%zd\n", x);
C99 স্ট্যান্ডার্ডে 7.19.6.1/7 দেখুন বা ফর্ম্যাটিং কোডগুলির আরও সুবিধাজনক POSIX ডকুমেন্টেশন:
http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html
যদি আপনার প্রয়োগগুলি সেই ফর্ম্যাটিং কোডগুলিকে সমর্থন করে না (উদাহরণস্বরূপ আপনি C89 তে রয়েছেন) তবে আফ্রিকের থেকে আপনার কিছুটা সমস্যা আছে যেহেতু সি 89 এ পূর্ণসংখ্যার ধরণ নেই যা ফরম্যাটিং কোড রয়েছে এবং এটির চেয়ে বড় হওয়ার গ্যারান্টি রয়েছে এই ধরনের হিসাবে। সুতরাং আপনার বাস্তবায়ন-নির্দিষ্ট কিছু করা দরকার।
উদাহরণস্বরূপ, যদি আপনার সংকলকটি থাকে long longএবং আপনার মানক গ্রন্থাগারটি সমর্থন করে %lld, আপনি আত্মবিশ্বাসের সাথে আশা করতে পারেন যে এটি তার জায়গায় কার্যকর হবে intmax_t। তবে যদি তা না হয় তবে আপনাকে ফিরে যেতে হবে long, যা এটি খুব ছোট কারণ এটি অন্য কয়েকটি বাস্তবায়নে ব্যর্থ হবে।
ssize_tএর সমান আকারের গ্যারান্টি দেয় না size_t, সুতরাং সত্যিকারের পোর্টেবল কোডটিকে এটিকে রূপান্তর করা উচিত intmax_tএবং %jdঠিক একইভাবে মুদ্রণ করা উচিত off_t।
মাইক্রোসফ্টের জন্য উত্তরটি আলাদা। ভিএস2013 মূলত সি 99 এর সাথে সম্মতিযুক্ত তবে "[টি] তিনি এইচ, জে, জেড এবং টি দৈর্ঘ্যের উপসর্গ সমর্থিত নয়।" সাইজ_টি "এর জন্য, যা 32-বিট প্ল্যাটফর্মে স্বাক্ষরযুক্ত __int32, 64-বিট প্ল্যাটফর্মগুলিতে স্বাক্ষরবিহীন __int64" টাইপ স্পেসিফার ও, ইউ, এক্স, বা এক্স সহ প্রিফিক্স I (মূল চোখ) ব্যবহার করুন V ভিএস2013 আকারের বিশদকরণ দেখুন
অফ_টি হিসাবে, এটি ভিসি হিসাবে দীর্ঘ হিসাবে সংজ্ঞায়িত করা হয়েছে \ অন্তর্ভুক্ত \ সিএস \ প্রকার।
off_tএটি সর্বদা long32-বিট করে তোলে তা নোট করুন (এমনকি 64-বিট উইন্ডোজ এর জন্য 32-বিট ব্যবহার করে long)।
আপনি সি এর কোন সংস্করণ ব্যবহার করছেন?
সি 90-এ, আদর্শ অনুশীলনটি হ'ল স্বাক্ষরিত বা স্বাক্ষরিত দীর্ঘ, যথাযথ হিসাবে কাস্ট করা এবং সেই অনুযায়ী প্রিন্ট করা। আমি আকার_t এর জন্য% z দেখেছি, তবে হার্বিসন এবং স্টিল প্রিন্টফ () এর আওতায় এটি উল্লেখ করে না, এবং যে কোনও ক্ষেত্রে আপনাকে পিটিডিফ_টি বা যে কোনও ক্ষেত্রে সহায়তা করবে না।
C99- তে বিভিন্ন _ টি প্রকারের নিজস্ব প্রিন্টফ ম্যাক্রোগুলি নিয়ে আসে, সুতরাং এর মতো কিছু "Size is " FOO " bytes." আমি বিশদ জানি না, তবে এটি ফাইলের অন্তর্ভুক্ত মোটামুটি বড় সংখ্যার বিন্যাসের অংশ।
আপনি ইন্টি টাইপস.h থেকে ফর্ম্যাটিং ম্যাক্রোগুলি ব্যবহার করতে চাইবেন।
এই প্রশ্নটি দেখুন: আকার_t টাইপের ভেরিয়েবলের জন্য ক্রস প্ল্যাটফর্ম ফর্ম্যাট স্ট্রিং?
off_tটাইপ কোনো 32-বিট সিস্টেমে একটি পয়েন্টার যে বড় ফাইল (যা অধিকাংশ 32 বিট সিস্টেম এই দিন হয়) সমর্থন চেয়ে বড়।
এ খুঁজছি man 3 printfলিনাক্স, OS X এর, এবং জন্য সব প্রদর্শনী সমর্থন OpenBSD %zজন্য size_tএবং %tজন্য ptrdiff_t(C99 জন্য) কিন্তু যারা উল্লেখ কেউই off_t। বন্য এ প্রস্তাবনা সাধারণত আপ অফার %uজন্য রূপান্তর off_t, যা "সঠিক যথেষ্ট" যতদূর আমি (উভয় বলতে পারেন হয় unsigned intএবং off_t64-বিট এবং 32 বিট ব্যবস্থার মধ্যে অভিন্নরুপে পরিবর্তিত হতে)।
unsigned intএবং 64-বিট রয়েছে off_t। সুতরাং theালাই ডেটা হারাতে পারে।
আমি এই পোস্টটি কমপক্ষে দু'বার দেখেছি কারণ গ্রহণযোগ্য উত্তরটি আমার পক্ষে মনে রাখা খুব কঠিন (আমি খুব কমই ব্যবহার করি zবা jপতাকা ব্যবহার করি এবং সেগুলি প্ল্যাটফর্মটি স্বতন্ত্র নয় বলে মনে হয় )।
মান বলছেন না পরিষ্কারভাবে সঠিক তথ্য দৈর্ঘ্য size_t, তাই আমি আপনাকে পরামর্শ দিচ্ছি আপনি যদি প্রথম দৈর্ঘ্য পরীক্ষা করা উচিত size_tআপনার প্ল্যাটফর্মে তারপর তাদের একটি নির্বাচন করুন:
if sizeof(size_t) == 4 use PRIu32
if sizeof(size_t) == 8 use PRIu64
এবং আমি stdintদৃistan়তার জন্য কাঁচা ডেটা প্রকারের পরিবর্তে প্রকারগুলি ব্যবহার করার পরামর্শ দিচ্ছি ।
%zuমুদ্রণের জন্য ব্যবহার করা যেতে পারে size_t। মুদ্রণের জন্য অবশ্যই কোনও uint32_t/ uint64_tফর্ম্যাট স্পেসিফায়ার ব্যবহার করা উচিত নয়size_t , কারণ এই ধরণেরগুলি উপযুক্ত কিনা তার কোনও গ্যারান্টি নেই।
যেমনটি আমি মনে করি, এটি করার একমাত্র পোর্টেবল উপায় হ'ল ফলাফলটি "স্বাক্ষরবিহীন দীর্ঘ ইনট" এ ফেলে দেওয়া এবং ব্যবহার করা %lu।
printf("sizeof(int) = %lu", (unsigned long) sizeof(int));
long longসি ++ স্ট্যান্ডার্ডে নেই এবং এইভাবে সহজাতভাবে অ-বহনযোগ্য।
fopen,fseek, ম্যাক OS X এর উপর ইত্যাদিoff_tজন্য অফসেট ব্যবহার করা হয়।