আমি off_t
এবং এর মতো প্রিন্ট প্রিন্ট করার চেষ্টা করছি size_t
। printf()
পোর্টেবলের জন্য সঠিক স্থানধারক কী ?
বা এই ভেরিয়েবলগুলি মুদ্রণের জন্য কি সম্পূর্ণ আলাদা উপায় আছে?
আমি off_t
এবং এর মতো প্রিন্ট প্রিন্ট করার চেষ্টা করছি size_t
। printf()
পোর্টেবলের জন্য সঠিক স্থানধারক কী ?
বা এই ভেরিয়েবলগুলি মুদ্রণের জন্য কি সম্পূর্ণ আলাদা উপায় আছে?
উত্তর:
আপনি আকার_t z
এবং t
ptrdiff_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
এটি সর্বদা long
32-বিট করে তোলে তা নোট করুন (এমনকি 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_t
64-বিট এবং 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
জন্য অফসেট ব্যবহার করা হয়।