2010-04-04 20 views
6

मेरे पास text.cpp है जिसमें header.h और header.cpp शामिल है जिसमें header.h शामिल है।सी ++ में शामिल हैं .h में उसी नाम के साथ .cpp भी शामिल है?

क्या header.cpp भी संकलित किया जाएगा? मैं यहां एक गाइड का अनुसरण कर रहा हूं, और मैं पूरी तरह उलझन में हूं।

इसके अलावा, मैं जो पूछ रहा हूं उसके लिए सही शब्दावली क्या है? मुझे पता है कि मैं एक मूर्खता की तरह लग रहा हूं, और मैं क्षमा चाहता हूं, लेकिन मैं अज्ञानी हूं।

ओह, int main() test.cpp में है।

इसके अलावा, अगर header.cpp में <iostream> शामिल है, तो मैं text.cpp में iostream फ़ंक्शन कॉल का उपयोग क्यों नहीं कर सकता अगर इसे शामिल किया गया हो? यदि मैं text.cpp में <iostream> शामिल करता हूं तो इसे दो बार प्रोग्राम में शामिल किया जाएगा (दूसरे शब्दों में, इसे फटकारा)?

+5

आप मूर्खता की तरह नहीं लगते हैं। एक मूर्खता मदद के लिए नहीं पूछता है। – GManNickG

उत्तर

4

आप अपने कंपाइलर को बताते हैं जो सी ++ फ़ाइलों को संकलित करने के लिए कहते हैं। #include के पास इसके साथ कुछ लेना देना नहीं है।

उदाहरण के लिए, आप जी उपयोग कर रहे हैं ++:

g++ text.cpp // Doesn't compile header.cpp 
g++ text.cpp header.cpp // Compiles both 

(or, alternatively you can compile one file at a time and then link them) 
g++ text.cpp -o text.o 
g++ header.cpp -o header.o 
g++ text.o header.o -o your-program 

आप दृश्य स्टूडियो का उपयोग करें और आप एक परियोजना बनाई है, तो आपके द्वारा बनाए गए सभी सी ++ फ़ाइलें स्वचालित रूप से संकलित किया जाएगा।

आप उपयोग कर न रहे हैं, तो मुझे अपने संकलक का नाम बता और मैं तुम्हें सटीक सिंटैक्स :)


बता सकते हैं अब अपने अन्य प्रश्न के लिए,:

इसके अलावा, अगर header.cpp में iostream शामिल है, यदि मैं में शामिल है तो मैं text.cpp में iostream फ़ंक्शन कॉल का उपयोग क्यों नहीं कर सकता? अगर मैं text.cpp में iostream शामिल करता हूं तो इसे प्रोग्राम में दो बार शामिल किया जाएगा (दूसरे शब्दों में, इसे ब्लोट करें)?

#include संकलक करने के लिए बस "आप भी शामिल कर रहे फ़ाइल के सभी सामग्री की प्रतिलिपि, और उन्हें पेस्ट जहां # शामिल लाइन है" कहता है। तो, सिद्धांत रूप में, आप आसानी से iostream को नोटपैड के साथ खोल सकते हैं, सभी को चुन सकते हैं, ctrl-c और ctrl-v इसे अपनी .cpp फ़ाइल में और अंत प्रभाव बिल्कुल वही होगा =)

तो हाँ इसे होने की आवश्यकता है प्रत्येक .cpp फ़ाइल के लिए शामिल है जिसमें आप इसका उपयोग करना चाहते हैं, और यह आपके प्रोग्राम को "ब्लोट" नहीं करेगा: इसमें केवल कक्षा परिभाषाएं, बाहरी कार्य, आदि शामिल हैं

ओह, और यह बिना कहने के चला जाता है, लेकिन सी ++ एक बहुत ही विशाल और कठिन प्रोग्रामिंग भाषा है, आपको गाइड की तुलना में पुस्तक के माध्यम से सीखने के लिए बहुत अच्छी किस्मत होगी। यदि आप कोई पैसा नहीं बिताना चाहते हैं, तो ठीक है (डाउनलोड करने योग्य) सी ++ पुस्तक Thinking in C++, Bruce Eckel है। अन्यथा यदि आप एक खरीदना चाहते हैं तो आप here की एक अच्छी सूची पा सकते हैं।

+0

बहुत बहुत धन्यवाद। मैं आपकी सलाह दिमाग में रखूंगा। – aaron

+1

SO पर एक सी ++ पुस्तक-सूची है: http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list –

1

header.cpp केवल संकलित किया गया है यदि आप इसे संकलित करते हैं। जब आप test.cpp संकलित करते हैं तो यह स्वचालित रूप से चूसा नहीं जाता है।चल रहे एक कार्यक्रम का उत्पादन करने के लिए, आप भी एक ही द्विआधारी में जिसके परिणामस्वरूप .o फ़ाइलों से जोड़ने के लिए, इस प्रकार है (oversimplified) है:

c++ -c test.cpp 
c++ -c header.cpp 
c++ -o test test.o header.o 
0

आप प्रत्येक स्रोत फ़ाइल संकलन, या एक साथ है, तो जिसके परिणामस्वरूप वस्तु मॉड्यूल लिंक।

उदा। विजुअल C++ (एक साथ)

या अलग से,

cl /c text.cpp 
cl /c header.cpp 
link text.obj header.obj /out:foo.exe 

, foo.exe एक परिणामी EXE छवि प्राप्त करने के लिए।

इसके अलावा, header.cpp , मैं iostream उपयोग नहीं कर सकते क्यों अगर यह शामिल है समारोह text.cpp में कॉल भी शामिल है तो क्या होगा? अगर मैं text.cpp में iostream शामिल करता हूं तो इसे प्रोग्राम में दो बार शामिल किया जाएगा (दूसरे शब्दों में, इसे ब्लोट करें)?

चूंकि हेडर में केवल घोषणाएं होती हैं, इसलिए उन्हें कई बार शामिल करने में कोई हानि नहीं होती है। वे कुछ भी नहीं फेंकेंगे, क्योंकि कंपाइलर टाइप चेकिंग करने के बाद उन्हें फेंक देता है।

हालांकि यदि आपके पास उनमें टाइप परिभाषाएं हैं, तो आपको # शामिल गार्ड की आवश्यकता है ताकि प्रकारों को फिर से परिभाषित न किया जा सके।

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