2010-05-28 9 views
7

मुझे अभी यह विकिपीडिया पर यह कोड मिला है।
लिंक: http://en.wikipedia.org/wiki/Sizeof#Useक्या यह एक सही वाक्यविन्यास है (विकिपीडिया पर सी कोड मिला है)?

कोड:

/* the following code illustrates the use of sizeof 
* with variables and expressions (no parentheses needed), 
* and with type names (parentheses needed) 
*/ 

char c; 

printf("%zu,%zu", sizeof c, sizeof(int)); 

यह कहा गया है कि: "Z उपसर्ग, उसका प्रिंट ले क्योंकि वास्तविक आकार प्रत्येक वास्तुकला पर अलग हो सकता है किया जाना चाहिए।"

मैं अपने संकलक पर यह कोशिश की, लेकिन यह निम्न परिणाम देता है:

'zu, zu'

उत्तर

7

हाँ कि वाक्य रचना (कम से कम C99 के लिए) सही है। ऐसा लगता है कि आपका कंपाइलर इसे संभालने के लिए स्थापित नहीं है। बस z लें और आप शायद ठीक हो जाएंगे। सही होने के लिए, सुनिश्चित करें कि आपके printf प्रारूप विनिर्देशक प्रकार के आकार से मेल खाते हैं। सभी संकल्पनाओं को चालू करना आपके कंपाइलर आपको शायद उस सम्मान में मदद करेगा।

आपका उद्धरण: क्योंकि वास्तविक आकार प्रत्येक वास्तुकला

तथ्य की बात कर रहा है पर कुछ अलग कर सकते हैं

z उपसर्ग, इसे प्रिंट करने के लिए इस्तेमाल किया जाना चाहिए कि size_t (जो प्रकार है sizeof ऑपरेटर द्वारा लौटाया गया) आर्किटेक्चर से वास्तुकला में भिन्न हो सकता है। z का उद्देश्य आपके कोड को अधिक पोर्टेबल बनाना है। हालांकि, अगर आपका कंपाइलर इसका समर्थन नहीं करता है, तो यह काम नहीं करेगा। %u, %lu इत्यादि के संयोजन के साथ बस बेवकूफ़ बनाओ जब तक आप आउटपुट बनाने की समझ न लें।

+0

+1 के लिए काम करता है ... – jcolebrand

+2

आप '% lu' का उपयोग कर सकते हैं और' sizeof' मान को स्पष्ट रूप से 'हस्ताक्षरित लंबे' तक कास्ट कर सकते हैं - जब तक आप जानते हैं कि ऑब्जेक्ट का आकार 4 जीबी से कम है, तो आपको पता चलेगा कि यह निश्चित रूप से सही तरीके से रिपोर्ट किया जाएगा। – caf

6

z लंबाई संशोधक सी 99 मानक में सी में जोड़ा गया था; आपके पास एक कंपाइलर हो सकता है जो C99 का समर्थन नहीं करता है।

अपने सी संकलक का समर्थन नहीं करता, तो आप शायद आकार अहस्ताक्षरित लंबे समय के रूप इलाज कर सकते हैं:

printf("%lu,%lu", (unsigned long)sizeof c, (unsigned long)sizeof(int)); 
1

आप अपने संकलक आप इसे एक C99 मस्तिष्क के साथ सोच चाहते हैं कि बताया? ऐसा करने के लिए शायद एक स्विच है। उदाहरण के लिए, जीसीसी के लिए -std=c99

अपने संकलक इसका समर्थन नहीं करता है, लेकिन क्या आप जानते हैं दूसरों के लिए, आप एक PRId64 शैली काम भी कर सकते हो जाएगा (अस्वीकरण - छद्म कोड आगे ..):

#ifdef __SOME_KNOWN_C99_COMPILER 
#define PORTUNSIGNED "zu" 
#else 
#define PORTUNSIGNED "u" 
#endif 

printf("%-11" PORTUNSIGNED " ways to skin a cat\n"); 

इसकी शायद बेहतर एक संकलक पाने के लिए हालांकि, सी 99 के लिए कार्यात्मक समर्थन है।

+2

प्रीप्रोसेसर बुरा नहीं है। –

+2

@ जॉर्ज: यह एक सार्वभौमिक राय नहीं है। –

+0

@ जॉर्ज - मैं इसकी बुराई नहीं कह रहा हूं, मैं बस इतना कह रहा हूं कि कुछ लोग वास्तव में इसका उपयोग कर रोकते हैं और इसके साथ सुधार शुरू करते हैं, जिससे दिलचस्प चीजें होती हैं जो अन्य लोगों को अंततः बनाए रखना पड़ता है :) –

2

हां, लेकिन यह केवल C99 -compliant compilers पर काम करता है। wikipedia से:

z: पूर्णांक प्रकारों के लिए, printf को आकार_टी आकार पूर्णांक तर्क की अपेक्षा करने का कारण बनता है।

0

मैंने जीसीसी 4.0 का उपयोग करके एक परीक्षण किया है। यह -std=c99

संबंधित मुद्दे