2016-08-02 8 views
11

कार्य उनके तर्कों को स्वीकार करने या एक int के बजाय एक size_t या स्पष्ट कारणों के लिए एक unsigned int के रूप में मान।fgets size_t की बजाय int को स्वीकार क्यों करता है? इस तरह के <code>strcpy()</code>, <code>malloc()</code>, <code>strlen()</code> और विभिन्न दूसरों के रूप में

कुछ फ़ाइल फ़ंक्शंस जैसे fread() और fwrite()size_t का भी उपयोग करें। विस्तार से, यह उम्मीद की जाएगी कि char* fgets (char *str, int num, FILE *stream) को size_t का उपयोग करना चाहिए और int अपने बफर आकार के लिए तर्क के रूप में नहीं होना चाहिए।

हालांकि, fgets()int का उपयोग करता है। क्या कोई उद्देश्य स्पष्टीकरण है?

+12

सी मानक पुस्तकालय में कोई स्थिरता नहीं है। कार्य समय के साथ विकसित हुआ है। 'fgets' पेश किए जाने पर 'size_t' अस्तित्व में नहीं था (बस मेरा अनुमान)। – user694733

+1

https://groups.google.com/forum/#!topic/comp.std.c/FnENEIlCidg – artm

+3

हिस्टोरिकल किशमिश। संभावित रूप से प्रारंभिक कार्यान्वयन (मानकीकरण से पहले) 'int' का उपयोग करने के लिए होता है और सी को मानकीकृत होने पर "संगतता" के लिए किया जाता है। और मैं * राय-आधारित * के रूप में बंद करने के लिए मतदान कर रहा हूं। –

उत्तर

9

मूल के & आर को int तर्क के साथ पी .155 पर परिभाषित किया गया। पुस्तक में प्रस्तुत कोड पर unsigned int के साथ काम करेगा (यह >0 का उपयोग करता है, लेकिन लूप को शून्य से नीचे कभी नहीं जाने के लिए लिखा जाता है)।

size_tC89 (एएनएसआई सी) में sizeof() के प्रकार के रूप में बाद में पेश किया गया। चूंकि इस सुविधा को स्मृति आवंटन को सुसंगत बनाने के लिए विशेष रूप से पेश किया गया था, स्मृति प्रबंधन फ़ंक्शन और स्ट्रिंग फ़ंक्शंस तदनुसार अपडेट किए गए थे। लेकिन फ़ाइल I/O नहीं था: C89 में size_t का उपयोग करने वाले एकमात्र फ़ाइल फ़ंक्शंस उन नए हैं सी 8 9 द्वारा पेश किए गए और के & आर में मौजूद नहीं थे जैसे कि उदाहरण के लिए fread()/fwrite()। हां, के & आर में इन फ़ंक्शन नहीं थे और फ़ाइल डिस्क्रिप्टर का उपयोग करके केवल (गैर पोर्टेबल) यूनिक्स पढ़ने/लिखने के कार्यों पर ब्लॉक ऑपरेशन के लिए निर्भर थे।

यह ध्यान दिया जाना चाहिए कि POSIX standard, जो यूनिक्स कार्यों सामंजस्य है, एएनएसआई सी मानक और issued late 1988 के समानांतर में विकसित किया गया था। इस मानक ने size_t का उपयोग करने के लिए कई यूनिक्स फ़ंक्शंस को सुसंगत बनाया है ताकि read()/write() आजकल size_t के साथ परिभाषित किए गए हैं। लेकिन इस तरह के fgets() के रूप में सी मानक पुस्तकालय कार्यों के लिए, POSIX सी मानक (मानक के वर्तमान संस्करण के शब्द) को महत्व देता है:

इस संदर्भ पृष्ठ पर वर्णित कार्यक्षमता आईएसओ सी मानक के साथ गठबंधन किया है । यहां वर्णित आवश्यकताओं और आईएसओ सी मानक के बीच कोई भी संघर्ष अनजान है।

तो POSIX में भी, विडंबना यह fgets() अभी भी अपनी ऐतिहासिक कश्मीर & आर int से विरासत में मिली।


संपादित करें: अतिरिक्त पढ़ने

stdio।एच: यह हेडर K& आर के अध्याय 7 में सूचीबद्ध अधिकांश कार्यों को परिभाषित करता है और प्रोटोटाइप करता है। कुछ, यदि कोई हो, तो में & आर में पाए गए परिभाषाओं में परिवर्तन किए गए थे लेकिन कई नए फ़ंक्शन जोड़े गए हैं।

+0

क्या आपको कोई विचार है कि नकारात्मक मूल्य पारित होने पर fgets के किसी भी उल्लेखनीय पूर्व-C89 कार्यान्वयन का अनुमान लगाया गया है [उदा। पूर्वानुमानित रूप से इसे शून्य की तरह व्यवहार करना, अनुमानित रूप से कुछ भी नहीं करना, डेटा के एन बाइट पढ़ना, लेकिन नई लाइन को छोड़ना आदि]? यदि ऐसा है, तो size_t में बदलने से उस सुविधा का समर्थन करने से मना कर दिया गया हो सकता है जब तक कि लंबाई SIZE_T_MAX-UINT_MAX तक सीमित नहीं थी [जो मैं बता सकता हूं, बफर आकार से अधिक लंबाई गुजरने के लिए परिभाषित व्यवहार है, एक नई लाइन सफलतापूर्वक समाप्त होने से पहले पढ़ी जाती है बफर]। – supercat

+1

के एंड आर की कार्यान्वयन तिथियां 1 9 78 से हैं। चूंकि यह पूर्णांक पर हस्ताक्षर किए गए हैं और पहली लूपिंग स्थिति '--n> 0' है और यह बफर में शून्य टर्मिनेटर को रोक देगा। तो पूरी तरह से अनुमान लगाया जा सकता है। यदि पैरामीटर को हस्ताक्षरित किया गया था, तो वही कोड बफर ओवरफ़्लो उत्पन्न कर सकता है, लेकिन अधिकतम UINT_MAX पुनरावृत्ति के बाद रुक जाएगा (जब तक कि हार्डवेयर साइन बिट की फ़्लिपिंग कैप्चर नहीं करेगा)। फिर वहां अन्य कार्यान्वयन भी हो सकते थे: पूर्व 89 में बहुत सारे कंपाइलर निर्माता थे, जिनमें से अधिकांश आज नहीं जानते हैं ;-)। – Christophe

+0

@supercat मैं अपने मानक पुस्तकालय के स्रोत के साथ 1 9 86 ([माइक्रोसॉफ्ट द्वारा अधिग्रहित] (https://en.wikipedia.org/wiki/Lattice_C)) के अपने पूर्व लैटिस सी कंपाइलर को वापस पा सकता हूं। 'fgets()' को 'i (0; i Christophe

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