2011-05-08 12 views
14

यह बहुत छोटा होना चाहिए। मैं एक बहुत ही बुनियादी सी कार्यक्रम के माध्यम से की तुलना स्ट्रिंग्स के लिए चल रहा था:सी शीर्षलेख फ़ाइलों के बिना कार्य

#include <stdio.h> 
int strcmp(char *s, char *t); 
int main() 
{ 
    printf("Returned: %d\n", strcmp("abc", "adf")); 
    return 0; 
} 

int strcmp(char *s, char *t) 
{ 
    printf("Blah\n"); 
    while (*s++ == *t++) 
    { 
     if (*s == '\0') 
      return 0; 
    } 
    return *s - *t; 
} 

तो मैं मूल रूप से strcmp समारोह के अपने स्वयं के संस्करण को क्रियान्वित किया है पहले से ही string.h में मौजूद। जब मैं उपर्युक्त कोड चलाता हूं, तो मुझे वास्तविक अनुमानित परिणामों की बजाय 0, 1, या -1 (कम से कम परीक्षण मामलों के मेरे छोटे सेट के लिए) के वापसी मान दिखाई देते हैं। अब मुझे एहसास है कि ऐसा इसलिए है क्योंकि कोड strcmp के मेरे लागू संस्करण पर नहीं जाता है, लेकिन इसके बजाय फ़ंक्शन के string.h संस्करण का उपयोग करता है, लेकिन मैं उलझन में हूं कि यह मामला क्यों है जब भी मैं ' टी उचित हेडर फ़ाइल शामिल नहीं है।

इसके अलावा, यह देखकर कि यह हेडर फ़ाइल संस्करण का उपयोग कैसे करता है, क्या मुझे कोड को संकलित करते समय 'एकाधिक कार्यान्वयन' त्रुटि (या उन पंक्तियों के साथ कुछ) नहीं मिलनी चाहिए?

+0

आपका अंतिम परीक्षण '* s ++ == * t ++' जो असफल हो सकता है, अभी भी आपके पॉइंटर्स को बढ़ाएगा ... क्या आप यही चाहते हैं? – Benoit

+0

हाँ, आप सही हैं। वह अंतिम पंक्ति * (- एस) - * (- टी) –

उत्तर

14

आप जीसीसी का उपयोग कर रहे हैं, है ना? जीसीसी संकलक में बिल्ट-इन्स के रूप में कुछ कार्यों को लागू करता है और ऐसा लगता है कि strcmp is one of those-fno-builtin स्विच के साथ अपनी फ़ाइल को संकलित करने का प्रयास करें।

शीर्षलेख फ़ाइलें केवल संकलक को बताएं कि कुछ प्रतीकों, मैक्रोज़ और प्रकार मौजूद हैं। हेडर फ़ाइल समेत या नहीं, इस पर कोई प्रभाव नहीं पड़ेगा कि कार्य कहां से आते हैं, यह लिंकर का काम है। यदि जीसीसी strcmp को libc से बाहर खींच रहा था तो आपको शायद एक चेतावनी दिखाई देगी।

+0

+1 यह उस उत्तर का हिस्सा है जिसे मैं नहीं जानता था :) – MByD

+1

मेरा उत्तर एक बड़ी गलती की तरह लगता है .. हटा दिया गया ... – MByD

+0

मुझे यकीन था कि यह पोस्ट नहीं किया गया था, यह शर्म की बात है ... – MByD

1

यह जानने के बिना कि कंपाइलर और lib क्या है। आपके द्वारा उपयोग किए जाने वाले संस्करण, सभी निष्कर्ष केवल 'संभावना' हैं। तो सबसे उचित बात यह है कि पहले से ही stdio.h शामिल stdlib.h या string.h

6

पहले जवाब के रूप में के रूप में सुंदर नहीं, इस किया जाना एक और तरीका

#include <stdio.h> 
static int strcmp(char *s, char *t); /* static makes it bind to file local sym */ 
int main() 
{ 
    printf("Returned: %d\n", strcmp("abc", "adf")); 
    return 0; 
} 

int strcmp(char *s, char *t) 
{ 
    printf("Blah\n"); 
    while (*s++ == *t++) 
    { 
     if (*s == '\0') 
      return 0; 
    } 
    return *s - *t; 
} 
0

strcmp एक मानक पुस्तकालय समारोह का नाम है। इस तरह आपको केवल फ़ंक्शन घोषित करने की अनुमति है (हालांकि आपको सही घोषणा का उपयोग करना होगा); आपको इसके लिए एक और परिभाषा प्रदान करने की अनुमति नहीं है। कार्यान्वयन यह मान सकता है कि जब भी आप strcmp का उपयोग करते हैं तो आप मानक लाइब्रेरी फ़ंक्शन का जिक्र कर रहे हैं भले ही आपने इसके लिए सही #include का उपयोग नहीं किया हो।

यदि आप वैकल्पिक strcmp प्रदान करना चाहते हैं तो आपको इसे वैकल्पिक नाम देना चाहिए।

+0

मैं अधिकांश लाइब्रेरी कार्यों का पुनर्वितरण प्रदान कर सकता हूं। उनमें से ज्यादातर ग्लिब में कमजोर घोषित किए गए हैं; भी, मानक केवल हेडर में परिभाषा के बारे में कहते हैं। यदि कोई हेडर शामिल नहीं है, तो कोई भी "लाइब्रेरी फ़ंक्शन" नहीं है और मैं कुछ भी घोषित कर सकता हूं, यहां तक ​​कि 'y0()' या गैर-मानक तरीके से कुछ परिभाषित कर सकता हूं, उदा। 'डबल strcmp (int, float *)'। कई कार्यान्वयन उपयोगकर्ता को मानक लाइब्रेरी ('-फनो-बिल्टिन' या '-फ्रेस्टैंडिंग') के बारे में धारणा को बंद करने की अनुमति देते हैं। मानक "होस्टेड पर्यावरण" ('मेजबान कार्यान्वयन अनुरूप' में लाइब्रेरी के बारे में कहता है, लेकिन एक 'अनुकूलन अनुकूलन कार्यान्वयन' है। – osgx

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