प्लेटफ़ॉर्म स्वतंत्र size_t प्रारूप विनिर्देशक सी में?


86

मैं size_tC में एक प्रकार के वेरिएबल को प्रिंट करना चाहता हूं, लेकिन ऐसा प्रतीत होता है कि size_tविभिन्न आर्किटेक्चर पर अलग-अलग वेरिएबल प्रकारों के लिए उपनाम है। उदाहरण के लिए, एक मशीन (64-बिट) पर निम्न कोड कोई चेतावनी नहीं देता है:

size_t size = 1;
printf("the size is %ld", size);

लेकिन मेरी अन्य मशीन (32-बिट) पर उपरोक्त कोड निम्नलिखित चेतावनी संदेश तैयार करता है:

चेतावनी: स्वरूप '% ld' प्रकार 'लंबी int *' की अपेक्षा करता है, लेकिन तर्क 3 में 'size_t *' प्रकार है

मुझे संदेह है कि यह पॉइंटर आकार में अंतर के कारण है, ताकि मेरी 64-बिट मशीन size_tपर long int( "%ld") को अलियास किया जाए , जबकि मेरी 32-बिट मशीन size_tको अन्य प्रकार से अलियास किया गया है।

क्या विशेष रूप से इसके लिए कोई प्रारूप निर्दिष्ट है size_t?


आपका चेतावनी संदेश कोड से मेल नहीं खाता है। चेतावनी में संकेत दिया गया है, आपके कोड में कोई भी नहीं है। क्या आपने &कहीं दूर किया ?
जेन्स

संकेत दिए गए? नहीं, मुझे पॉइंटर्स के बारे में कोई चेतावनी नहीं मिलती है, वास्तव में मैं किस कोड पर मशीन चलाता हूं इसके आधार पर मुझे कभी-कभी कोई चेतावनी नहीं मिलती है। निम्नलिखित परीक्षण कोड आज़माएं: #include <stdio.h> int main () {size_t size = 1; प्रिंटफ ("आकार% ld है", आकार); वापसी 0; }
एथन हेइल्मन


1
@EthanHeilman वह इस तथ्य का जिक्र है कि आपके चेतावनी कहना warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *'है जब यह शायद चाहिए कह रहे warning: format '%ld' expects type 'long int', but argument 3 has type 'size_t'scanf()जब आप इन चेतावनियों को प्राप्त करते हैं तो क्या आप शायद इसके बजाय उपयोग कर रहे थे ?
19

जवाबों:


123

हाँ: zलंबाई संशोधक का उपयोग करें :

size_t size = sizeof(char);
printf("the size is %zu\n", size);  // decimal size_t ("u" for unsigned)
printf("the size is %zx\n", size);  // hex size_t

उपलब्ध अन्य लंबाई संशोधक hh(के लिए char), h(के लिए short), l(के लिए long), ll(के लिए long long), j(के लिए intmax_t), t(के लिए ptrdiff_t), और L(के लिए long double) हैं। C99 मानक का the7.19.6.1 (7) देखें।


zd और zu में क्या अंतर है? मुझे लगता है कि zd दशमलव है, लेकिन क्या यह हस्ताक्षरित है, यदि ऐसा है तो zd कैसे हस्ताक्षरित प्रभाव वाली चीजें करता है।
एथन हेइलमैन

1
यह एक size_tऔर एक के बीच का अंतर है ssize_t; उत्तरार्द्ध शायद ही कभी इस्तेमाल किया जाता है।
एडम रोसेनफील्ड

26
सही है, इसलिए इस मामले में, आपको उपयोग करना चाहिए %zu, क्योंकि तर्क अहस्ताक्षरित है।
कैफे

उपलब्ध अन्य विकल्पों को प्रिंटफ
INS

9
@detly: नहीं, zलंबाई संशोधक C89 / C90 का हिस्सा नहीं है। यदि आप C89- आज्ञाकारी कोड के लिए लक्ष्य कर रहे हैं, तो आप जो सबसे अच्छा कर सकते हैं, वह है unsigned longऔर lइसके बजाय लंबाई संशोधक का उपयोग करना printf("the size is %lu\n", (unsigned long)size);; C89 और सिस्टम से size_tबड़े दोनों का समर्थन करना मुश्किल longहै और इसके लिए कई प्रीप्रोसेसर मैक्रोज़ का उपयोग करना होगा।
एडम रोसेनफील्ड

45

हाँ वहाँ है। यह %zu(ANSI C99 में निर्दिष्ट) है।

size_t size = 1;
printf("the size is %zu", size);

ध्यान दें कि size_tअहस्ताक्षरित है, इस प्रकार %ldडबल गलत है: गलत लंबाई संशोधक और गलत प्रारूप रूपांतरण विनिर्देशक। यदि आप आश्चर्यचकित हैं, तो इसके %zdलिए ssize_t(जिस पर हस्ताक्षर किए गए हैं)।


1

MSDN , का कहना है कि विज़ुअल स्टूडियो 32 और 64 बिट प्लेटफार्मों पर कोड पोर्टेबल के लिए "I" उपसर्ग का समर्थन करता है।

size_t size = 10;
printf("size is %Iu", size);

6
यह एमएस विशिष्ट है, जो मानक अनुरूप नहीं है, इसलिए यह स्वतंत्र नहीं है
फुल्विक

@phuclv वास्तव में। और अगर यह वास्तव में कहता है - जैसा कि उत्तर से पता चलता है - 'पोर्टेबल' यह उससे भी बदतर है जितना मैं कभी एमएस के बारे में जानता था। ऐसा नहीं है कि यह मुझे आश्चर्यचकित करेगा ... मैं किसी को नीचा दिखाने के लिए नहीं हूं क्योंकि कोई व्यक्ति कुछ प्रयास करने और उत्तर देने के प्रयास से गुजरा है, लेकिन फिर भी यह उत्तर गलत है। आह, मुझे लगता है कि मैं 'पोर्टेबल' में यहां के विचार को समझता हूं। यह कहना होगा कि यह 32-बिट और 64-बिट दोनों के लिए काम करता है। लेकिन निश्चित रूप से यह होगा।
15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.