मैं समझना चाहता हूं कि प्रोग्राम कंपाइलर का कौन सा हिस्सा दिखता है और कौन सा लिंकर दिखता है। तो मैं निम्नलिखित कोड लिखा है:सी ++: कंपाइलर और लिंकर कार्यक्षमता
#include <iostream>
using namespace std;
#include <string>
class Test {
private:
int i;
public:
Test(int val) {i=val ;}
void DefinedCorrectFunction(int val);
void DefinedIncorrectFunction(int val);
void NonDefinedFunction(int val);
template <class paramType>
void FunctionTemplate (paramType val) { i = val }
};
void Test::DefinedCorrectFunction(int val)
{
i = val;
}
void Test::DefinedIncorrectFunction(int val)
{
i = val
}
void main()
{
Test testObject(1);
//testObject.NonDefinedFunction(2);
//testObject.FunctionTemplate<int>(2);
}
मैं तीन कार्य होते हैं:
- DefinedCorrectFunction - यह एक सामान्य समारोह की घोषणा की और सही ढंग से परिभाषित है।
- परिभाषित अंतर्निहित कार्य - यह फ़ंक्शन सही ढंग से घोषित किया गया है लेकिन कार्यान्वयन गलत है (गायब;)
- गैर परिभाषित कार्य - केवल घोषणा। कोई परिभाषा नहीं
फ़ंक्शन टेम्पलेट - एक फ़ंक्शन टेम्पलेट।
अब अगर मैं इस कोड को संकलित करता हूं तो मुझे DefinedIncorrectFunction में अनुपलब्ध ';' के लिए एक कंपाइलर त्रुटि मिलती है।
मान लीजिए कि मैं इसे ठीक करता हूं और फिर testObject.NonDefinedFunction (2) पर टिप्पणी करता हूं। अब मुझे एक लिंकर त्रुटि मिलती है। अब testObject.FunctionTemplate (2) पर टिप्पणी करें। अब मुझे गायब ';' के लिए एक कंपाइलर त्रुटि मिलती है।
फ़ंक्शन टेम्पलेट्स के लिए मैं समझता हूं कि जब तक उन्हें कोड में शामिल नहीं किया जाता है तब तक वे संकलक द्वारा स्पर्श नहीं होते हैं। तो लापता ';' जब तक मैं testObject.FunctionTemplate (2) कहता हूं तब तक संकलक द्वारा शिकायत नहीं की जाती है।
testObject.NonDefinedFunction (2) के लिए, कंपाइलर शिकायत नहीं करता था लेकिन लिंकर ने किया था। मेरी समझ के लिए, सभी कंपाइलर देखभाल को यह जानना था कि एक गैर परिभाषित फ़ंक्शन फ़ंक्शन घोषित किया गया है। यह कार्यान्वयन की परवाह नहीं थी। फिर लिंकर शिकायत की क्योंकि इसे कार्यान्वयन नहीं मिला। अब तक सब ठीक है।
जहां मैं भ्रमित हो जाता हूं तब संकलक ने DefinedIncorrectFunction के बारे में शिकायत की है। यह NonDefinedFunction के कार्यान्वयन की तलाश नहीं करता था लेकिन यह DefinedIncorrectFunction के माध्यम से चला गया।
तो मैं थोड़ा अस्पष्ट हूं कि संकलक वास्तव में क्या करता है और लिंकर क्या करता है। मेरी समझ उनके कॉल के साथ लिंकर लिंक घटक है। इसलिए जब गैर-परिभाषित समारोह कहा जाता है तो यह गैर परिभाषित समारोह के संकलित कार्यान्वयन की जांच करता है और शिकायत करता है। लेकिन कंपाइलर ने NonDefinedFunction के कार्यान्वयन की परवाह नहीं की लेकिन यह DefinedIncorrectFunction के लिए किया था।
अगर कोई इसे समझा सकता है या कुछ संदर्भ प्रदान कर सकता है तो मैं वास्तव में सराहना करता हूं।
धन्यवाद।
आपने इसे रेडबर्न ने खींचा! इस महान स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। – madu