2012-07-04 17 views
5

आज मेरे पास एक साक्षात्कार था, उन्होंने मुझसे पूछा कि क्या हम .c file को स्रोत फ़ाइल में शामिल कर सकते हैं? मैंने कहा yes। क्योंकि कुछ साल पहले मैंने कुछ परियोजनाओं में ऐसा देखा जहां उन्होंने .c file शामिल किया है। लेकिन अभी मैं वही कोशिश कर रहा था।क्या हम .c फ़ाइल शामिल नहीं कर सकते?

abc.c

#include<stdio.h> 
void abc() 
{ printf("From ABC() \n"); } 


main.c

#include<stdio.h> 
#include "abc.c" 
int main() 
{ void abc(); 
    return 0; 
} 

त्रुटि मिल रही है:

D:\Embedded\...\abc.c :- multiple definition of 'abc'

यह गलत कहां जा रहा है?

मैं एक abc.h फ़ाइल में लिखा था (abc.h के शरीर { extern void abc(void); } है), और abc.c में फ़ाइल शामिल (#include abc.c बाहर टिप्पणी)। ठीक काम किया।

+0

("ठीक काम किया" * * चेतावनी को सक्षम करने पर?) –

+3

ठीक है, 'abc' की कई परिभाषाएं हैं, बस के रूप में संकलक का कहना है –

+0

यह बहुत समय हो गया एक स्क्रिप्ट एक makefile लिखने के लिए आलसी जा रहा है, या कम से कम बहु-फ़ाइल कोड संकलित करने के लिए (आईडीई का उपयोग नहीं करते समय)। '.c' फ़ाइल को शामिल करते समय बस कल्पना करें कि उस फ़ाइल की पूरी सामग्री उस स्थिति पर होगी, और यह देखने के लिए कि आपको पुनः परिभाषाओं को समायोजित करने की आवश्यकता है। – phoxis

उत्तर

14

इस प्रकार करें:

abc.c:

#include <stdio.h> 
void abc() 
{printf("From ABC() \n");} 

main.c:

#include<stdio.h> 
#include "abc.c" 
int main() 
{ 
    abc(); 
    return 0; 
} 

(कोई हेडर फाइल की जरुरत)

फिर, संकलित करने के लिए, आप ' डी केवल संकलन main.cabc.c और main.c दोनों का संकलन न करें, क्योंकि तब आपके पास abc() फ़ंक्शन दो बार परिभाषित होगा।

आपको यह समझने की आवश्यकता है कि #include मूल रूप से "कॉपी-पेस्ट" है, और कुछ नहीं। यदि आप इसे #include "abc.c" बताते हैं, तो यह केवल abc.c की सामग्री ले जाएगा, और उन्हें main.c फ़ाइल में "पेस्ट" करेगा। इसलिए, main.c के लिए ऊपर का उपयोग कर, पूर्वप्रक्रमक यह प्रक्रियाओं के बाद, अपने main.c इस तरह दिखेगा (मैं #include <stdio.h> रों अनदेखी कर रहा हूँ):

#include<stdio.h> 
#include <stdio.h> 
void abc() 
{printf("From ABC() \n");} 
int main() 
{ 
    abc(); 
    return 0; 
} 

जो एक वैध कार्यक्रम है।

ने कहा कि आपको आमतौर पर ऐसा नहीं करना चाहिए; आपको अपनी सभी .c फ़ाइलों को अलग से संकलित करना चाहिए और केवल तभी उन्हें एक साथ जोड़ना चाहिए।

+2

प्रोटोटाइप मुद्दा नहीं है। इससे * एकाधिक परिभाषा * त्रुटि नहीं होगी। – ThiefMaster

+0

@houbysoft: मैंने वही किया लेकिन फिर भी त्रुटि है। कोई सुधार –

+0

मैं दूसरा @TiefMaster। उपर्युक्त करने से अभी भी एक त्रुटि होनी चाहिए, क्योंकि 'शून्य abc()' को दो अनुवाद इकाइयों में परिभाषित किया गया है: abc.c और main.c (शामिल के माध्यम से)। लिंकर अभी भी शिकायत करनी चाहिए। – eran

5

सी फाइलों सहित, जब तक आप शामिल सी फ़ाइल को संकलित करने की कोशिश नहीं करते हैं तब तक पूरी तरह से मान्य है और उसके बाद इसे फ़ाइल फ़ाइल से ऑब्जेक्ट फ़ाइल के साथ लिंक करें जिसमें अन्य फ़ाइल शामिल है।

यदि आप ऐसा करते हैं तो आपके पास दो फाइलों में परिभाषित एक ही प्रतीक (आमतौर पर एक फ़ंक्शन) होगा जिसके परिणामस्वरूप आपके द्वारा पोस्ट की गई त्रुटियां होंगी।

यदि आपके पास एकाधिक स्रोत फ़ाइलें हैं तो आप आमतौर पर उन्हें शामिल नहीं करते हैं लेकिन उन्हें अलग से संकलित करते हैं। लिंकर फिर ऑब्जेक्ट फ़ाइलों को एक निष्पादन योग्य (या लाइब्रेरी) में विलीन करता है।

4

आप किसी भी एक्सटेंशन के साथ फ़ाइल शामिल कर सकते हैं।

अपने कार्यक्रम में, आपने मुख्य() में void abc(); को फिर से परिभाषित किया था। इसके बजाय बस कथन abc();

+0

मैंने जो शोध किया है, उससे यह स्पष्ट और सरल जवाब है। पक्ष में मत देना! – ChinoCarloSedilla

2

आप जो कुछ भी पसंद करते हैं उसे शामिल कर सकते हैं, प्रीप्रोसेसर फ़ाइल एक्सटेंशन की परवाह नहीं करता है। हेडर ".h" और स्रोत फ़ाइलों ".c" या ".cpp" नाम देने के लिए केवल कुछ परंपरा है।

आपको केवल यह सुनिश्चित करना होगा कि पूरे प्रोजेक्ट को संकलित करने के बाद आप लिंकर समस्याओं में भाग नहीं लेते हैं (उदाहरण के लिए कंपाइलर को "abc.c" और "main.c" दोनों देना आपके परिणाम की कई परिभाषाओं के परिणामस्वरूप होगा समारोह)।

+0

बहुत बहुत धन्यवाद .... –

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