2010-06-23 14 views
9

मेरे पास एक छोटी परियोजना है जिसमें मैंने दो अलग-अलग स्रोत फ़ाइल में दो अलग-अलग नाम फ़ंक्शन का नाम दिया है, लेकिन जब मैं प्रोजेक्ट का निर्माण करता हूं, तो कंपाइलर 'func_name पहले से ही filename.obj में परिभाषित' के साथ विफल रहा है।सी के भीतर डुप्लिकेट फ़ंक्शन नाम से कैसे निपटें?

मेरे पास दो अलग-अलग स्रोत फ़ाइलों में एक ही नाम के साथ दो कार्य क्यों नहीं हो सकते? मैंने सोचा कि फ़ंक्शन केवल स्रोत फ़ाइल के लिए स्थानीय होना चाहिए यदि हमने इसे हेडर फ़ाइल में घोषित किया तो यह वैश्विक हो जाएगा।

और फ़ाइल नाम बदलने के अलावा, सी प्रोग्रामिंग भाषा में डुप्लिकेट फ़ंक्शन नाम के लिए कोई अन्य सुरुचिपूर्ण समाधान है?

+0

यही कारण है कि मैं हमेशा चर और कार्यों के लिए वास्तव में सार्थक नामों का उपयोग करता हूं। यदि वे दो कार्य एक ही काम कर रहे हैं तो आपको उनमें से किसी एक की आवश्यकता नहीं है। यदि वे अलग-अलग चीजें कर रहे हैं तो प्रत्येक को एक सार्थक नाम दें जो दर्शाता है कि यह क्या करता है। जो भी आपका कोड बनाए रखना है, वह आपको धन्यवाद देगा। संभावना है, वह आप होंगे। – Mawg

उत्तर

28

सी में एक समारोह डिफ़ॉल्ट रूप से वैश्विक गुंजाइश है। अपने दायरे को सीमित करने के लिए, इसे मॉड्यूल में निजी बनाने के लिए static कीवर्ड का उपयोग करें।

हेडर फ़ाइल की भूमिका केवल अन्य मॉड्यूल के हस्ताक्षर के साथ फ़ंक्शन को प्रचारित करने के लिए है।

सभी वैश्विक नामों (कुछ चेतावनियों के साथ) अद्वितीय होना चाहिए। यह समझ में आता है क्योंकि लिंक का उपयोग फ़ंक्शन के कार्यान्वयन के लिए फ़ंक्शन कॉल को कनेक्ट करने के लिए किया जाता है।

स्थिर और स्थानीय दायरे वाले नाम केवल उनके दायरे में अद्वितीय होने चाहिए।

+7

सलाह: प्रत्येक स्थिर कार्य को 'स्थिर' के रूप में चिह्नित करें। यह कंपाइलर के अनुकूलक के लिए भी आसान बना देगा, उदाहरण के लिए इनलाइन फ़ंक्शंस और इसी तरह का चयन करना। – u0b34a0f6ae

2

सुरुचिपूर्ण समाधान नाम + सी ++ में पेश किए गए नामस्थान हैं। समाधान, अगर func_name पर कुछ कॉल हैं, तो इसे ले लें, इसका नाम बदलें और पुनः संकलित करें।

कुछ hackerous लेकिन त्वरित समाधान इस हो सकता है:

//In one of the two source files and any file that calls it 

//if your functions is something like this 
//void func_name(int) { ... } 
//Add the following line 
#define func_name SOME_UNIQUE_FUNC_NAME 
+4

आरबीरटेग द्वारा सुझाए गए अनुसार स्थिर घोषित करना सबसे अच्छा समाधान है। मैं उम्मीद में अपना जवाब छोड़ देता हूं कि किसी भी तरह से यह सहायक हो सकता है। – user347594

+0

यह एक समान समस्या के साथ सहायक था जिसे मैं सामना कर रहा था। धन्यवाद। – FilipeCanatto

4

फ़ाइल को स्थानीय बनाने के लिए static फ़ंक्शन घोषित करें। सी में, प्रत्येक पहचानकर्ता नाम अद्वितीय होना चाहिए।

5

Why could not I have two function with the same name in two differenct source file?

लिंकर क्योंकि पता करने के लिए जो जब आप इसे संदर्भ के लिए है की जरूरत है।

Imagaien a.h और b.h दोनों my_function() defclare दोनों। कंपाइलर दोनों के लिए कोड उत्पन्न करता है। अब, कल्पना करें कि c.c कॉल my_function() - लिंकर को कैसे पता चलता है कि फ़ंक्शन के दो संस्करणों को किस नाम से जाना चाहिए?

5

चाहे हेडर फ़ाइल में या स्रोत फ़ाइल में कुछ चीज़ घोषित की गई हो, तो कंपाइलर के लिए बिल्कुल कोई फर्क नहीं पड़ता। वास्तव में, संकलक उचित रूप से किसी भी "हेडर फाइल" के बारे में बिल्कुल कुछ नहीं जानता है, क्योंकि हेडर फ़ाइलों को प्रीप्रोसेसर द्वारा स्रोत फ़ाइलों में एम्बेड किया गया है, जो संकलक के ठीक पहले अपना काम करता है। जब तक स्रोत फाइलें (एम्बेडेड हेडर फाइलों के साथ) वास्तविक कंपाइलर पर पहुंच जाती हैं, तो मूल रूप से क्या था और हेडर फ़ाइलों से क्या डाला गया था, यह बताने का कोई तरीका नहीं है। उसमें एम्बेडेड सभी शीर्षलेख फ़ाइलों के साथ स्रोत फ़ाइल को अनुवाद इकाई कहा जाता है। अर्थात। संकलक उचित इकाइयों के साथ काम करता है, कुछ "स्रोत" या "हेडर" फ़ाइलों के साथ नहीं।

सी भाषा में फ़ाइल स्कोप पर घोषित सभी ऑब्जेक्ट्स और फ़ंक्शंस में बाहरी लिंक डिफ़ॉल्ट रूप से है, जिसका अर्थ है कि वे पूरे कार्यक्रम के लिए वैश्विक हैं, अद्वितीय हैं। तो, आपने गलत तरीके से सोचा था। फ़ंक्शंस केवल एक स्रोत फ़ाइल के लिए स्थानीय नहीं हैं।

यदि आप एकल अनुवाद इकाई में कोई फ़ंक्शन (या ऑब्जेक्ट) स्थानीय बनाना चाहते हैं, तो आपको कुछ स्पष्ट कदम उठाने होंगे। आपको इसे static के रूप में घोषित करना होगा। इसे स्थिर के रूप में घोषित करने से यह आंतरिक लिंक प्रदान करेगा, जिसका अनिवार्य रूप से अर्थ है कि यह इसकी अनुवाद इकाई के लिए आंतरिक हो जाता है।

अपने कार्यों को घोषित करना static केवल तभी काम करेगा यदि उनमें से दोनों को वास्तव में अपनी स्वयं की अनुवाद इकाइयों में स्थानीय होना है। यदि यह मामला नहीं है, यानी यदि कम से कम एक कार्य वैश्विक रूप से सुलभ (लिंक करने योग्य) फ़ंक्शन होना चाहिए, तो आपके पास किसी एक कार्य का नाम बदलने के अलावा कोई अन्य विकल्प नहीं है।

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