2012-07-18 14 views
7

मैं किसी तृतीय पक्ष लाइब्रेरी का उपयोग करके कुछ काम शुरू कर रहा हूं और इसे विजुअल स्टूडियो 2010 में बनाते समय, मैंने देखा कि मुझे यह लिंकर चेतावनी कई बार प्राप्त हो रही थी (LNK4221)। मैंने उन ऑब्जेक्ट फ़ाइलों को बनाने में प्रयुक्त स्रोतों को देखा जो लिंक किए जा रहे थे और पाया कि इनके लिए सभी कार्यान्वयन हेडर फ़ाइलों में स्थित है। दिलचस्प बात यह है कि मैंने यह भी देखा कि इस परियोजना में संबंधित .cpp फाइलें शामिल हैं जिनमें केवल कार्यान्वयन के साथ शीर्षलेख के लिए शामिल है।एक .cpp फ़ाइल का बिंदु क्या है जिसमें केवल एक # शामिल है?

मैं उत्सुक हूं - इसका क्या मतलब है और मैं इस तकनीक का उपयोग क्यों करना चाहूंगा? यदि .cpp फ़ाइलें प्रोजेक्ट में कोई मान नहीं जोड़ रही हैं, तो लिंकर चेतावनियों से छुटकारा पाने के लिए मुझे उन्हें क्यों नहीं हटाया जाना चाहिए?

मैंने इसी तरह के प्रश्नों की खोज करने की कोशिश की, लेकिन रुचि के कुछ भी नहीं मिला। यदि आप किसी के बारे में जानते हैं, तो कृपया उन्हें लिंक करें।

+0

यह एक चेतावनी है, कोई त्रुटि नहीं। –

+0

हाँ, मुझे पता है। मैं केवल एक एकल # शामिल सहित .cpp फ़ाइलों का उपयोग करने की तकनीक की तुलना में चेतावनी के बारे में चिंतित हूं। –

+2

दो संभावित प्रेरणा: 1 - हमेशा '.h' /' .cpp' जोड़े रखने के लिए अच्छा अभ्यास माना जा सकता है। शायद लेखक ने सोचा कि वे बाद में '.cpp' में जोड़ देंगे। 2 - एक '.h' फ़ाइल किसी ऑब्जेक्ट फ़ाइल में संकलित नहीं की जा सकती है, एक' .cpp' फ़ाइल कर सकते हैं। – BoBTFish

उत्तर

1

मैं यह सुनिश्चित करने के लिए इसका उपयोग कर रहा हूं कि हेडर कम से कम एक फ़ाइल में पहली फ़ाइल में शामिल है। ऐसा करके, मैं सुनिश्चित करता हूं कि हेडर अपने आप पर संकलित है।

लिंकर convence करने के लिए एक चेतावनी जारी नहीं करने के लिए, एक एक बहुत बड़ी चर के साथ एक बाहरी चर इस्तेमाल कर सकते हैं:

int variable_with_a_name_that_includes_the_file_name_somehow = 42; 
+0

हां, यह समझ में आता है, लेकिन क्या आप उस फ़ाइल को हटा देंगे यदि आपने बाद में हेडर का इस्तेमाल कहीं और किया था? –

+0

@ जो नहीं, जब इसे कहीं और शामिल किया गया है, तो यह सुनिश्चित करना मुश्किल है, यह भविष्य में ऐसा करेगा और इसमें शामिल होने से पहले कोई भी शामिल नहीं होगा। –

+0

ठीक है, तो उस स्थिति में यह सड़क के दुरुपयोग के खिलाफ केवल सुरक्षा गार्ड के रूप में कार्य करता है। धन्यवाद! –

2

था एकल #include d फ़ाइल stdafx.h? I. उस मामले में, आप precompiled headers से निपट रहे हैं। सामान्य सेटअप एक .cpp फ़ाइल के लिए होता है जिसमें "प्रीकंपिल्ड हेडर" कंपाइलर विकल्प उत्पन्न होता है, और शेष प्रोजेक्ट में शेष .cpp फ़ाइलों को "पीच का उपयोग" होता है।

+0

नहीं, यह वास्तव में stdafx.h नहीं था, लेकिन जब मैंने पहले जवाबों की तलाश की तो मुझे इसके संदर्भ मिल गए। हालांकि, यह अभी भी उपयोगी जानकारी है, इसलिए धन्यवाद! –