2012-03-02 16 views
5

मैं समझना चाहता हूं कि प्रोग्राम कंपाइलर का कौन सा हिस्सा दिखता है और कौन सा लिंकर दिखता है। तो मैं निम्नलिखित कोड लिखा है:सी ++: कंपाइलर और लिंकर कार्यक्षमता

#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 के लिए किया था।

अगर कोई इसे समझा सकता है या कुछ संदर्भ प्रदान कर सकता है तो मैं वास्तव में सराहना करता हूं।

धन्यवाद।

उत्तर

4

कंपाइलर का कार्य संकलित संकुल है जिसे आपने लिखा है और इसे ऑब्जेक्ट फ़ाइलों में परिवर्तित किया है। इसलिए यदि आपने ; को याद किया है या एक अपरिभाषित चर का उपयोग किया है, तो संकलक शिकायत करेगा क्योंकि ये वाक्यविन्यास त्रुटियां हैं।

यदि संकलन बिना किसी हिचकिचाहट के प्राप्त होता है, तो object files उत्पादित होते हैं। वस्तु फ़ाइलों एक जटिल संरचना है, लेकिन मूल रूप से पाँच बातें

शामिल
  1. हेडर - कोड मशीन भाषा में (यह कोड ज्यादातर मामलों में अपने आप में नहीं चल सकता)
  2. पुनर्वास - फ़ाइल
  3. वस्तु संहिता के बारे में जानकारी सूचना - वास्तविक निष्पादन
  4. प्रतीक तालिका - कोड द्वारा संदर्भित प्रतीक के दौरान कोड के किस भाग को बदलना होगा। वे दूसरे मॉड्यूल से आयात या लिंकर
  5. डिबगिंग जानकारी द्वारा परिभाषित इस कोड में परिभाषित किया जा सकता - डिबगर

संकलक कोड संकलित करता है तथा हर प्रतीक यह मुठभेड़ों के साथ प्रतीक तालिका भरता द्वारा प्रयुक्त। प्रतीक दोनों चर और कार्यों को संदर्भित करता है। This question का उत्तर प्रतीक तालिका बताता है।

इसमें निष्पादन योग्य कोड और डेटा का संग्रह शामिल है जो लिंकर एक कार्यरत अनुप्रयोग या साझा लाइब्रेरी में संसाधित कर सकता है। ऑब्जेक्ट फ़ाइल में एक डेटा स्ट्रक्चर है जिसमें एक प्रतीक तालिका कहा जाता है जो ऑब्जेक्ट फ़ाइल में अलग-अलग आइटमों को उन नामों के लिए मानचित्र करता है जिन्हें लिंकर समझ सकता है।

बिंदु नोट करने के लिए

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

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

तो अपने विशिष्ट मामले में -

  1. DefinedIncorrectFunction() - संकलक समारोह की परिभाषा हो जाता है और यह संकलन वस्तु कोड बनाने के लिए और प्रतीक तालिका में उचित संदर्भ डालने के लिए शुरू होता है। संकलन त्रुटि के कारण संकलन विफल रहता है, इसलिए एक त्रुटि के साथ कंपाइलर aborts।
  2. NonDefinedFunction() - तो यह प्रतीक मेज और झंडे उचित मान जोड़ने के लिए (के बाद से लिंकर वस्तु फाइलों का एक समूह पर कार्रवाई करेंगे लिंकर के लिए एक प्रविष्टि जोड़ देता है संकलक घोषणा लेकिन कोई परिभाषा हो जाता है, यह संभव है यह कुछ में मौजूद definitionis अन्य ऑब्जेक्ट फ़ाइल)। आपके मामले में आप तो लिंकर एक undefined reference to NonDefinedFunction त्रुटि के साथ रोकता है क्योंकि यह चिंतित प्रतीक तालिका प्रविष्टि के संदर्भ में नहीं मिल सकता है, किसी भी अन्य फाइल निर्दिष्ट नहीं करते।

को समझने के लिए इसे आगे कहते हैं कि अपने कोड

फ़ाइल निम्नलिखित try.h

#include<string> 
#include<iostream> 


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; } 
}; 

फ़ाइल try.cpp

#include "try.h" 


void Test::DefinedCorrectFunction(int val) 
{ 
    i = val; 
} 

void Test::DefinedIncorrectFunction(int val) 
{ 
    i = val; 
} 

int main() 
{ 

    Test testObject(1); 
    testObject.NonDefinedFunction(2); 
    //testObject.FunctionTemplate<int>(2); 
    return 0; 
} 

हमें पहले ही copile करते हैं के रूप में संरचित है की सुविधा देता है और कोड को इकट्ठा लेकिन यह

लिंक नहीं 10

किसी भी समस्या के बिना यह कदम आय। तो आपके पास try.o. में ऑब्जेक्ट कोड है आइए इसे

$g++ try.o 
try.o: In function `main': 
try.cpp:(.text+0x52): undefined reference to `Test::NonDefinedFunction(int)' 
collect2: ld returned 1 exit status 

आप टेस्ट :: गैर परिभाषित फ़ंक्शन को परिभाषित करना भूल गए हैं। आइए इसे अलग फ़ाइल में परिभाषित करें।

फ़ाइल try1.cpp

#include "try.h" 

void Test::NonDefinedFunction(int val) 
{ 
    i = val; 
} 

हमें वस्तु कोड में संकलन

$ g++ -c try1.cpp -o try1.o 
$ 

फिर यह सफल हुआ करते हैं। आइए हम केवल इस फ़ाइल को लिंक करने का प्रयास करें

$ g++ try1.o 
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 
collect2: ld returned 1 exit status 

कोई भी मुख्य 'जी लिंक नहीं मिला !!

अब आपके पास दो अलग वस्तु कोड सभी घटकों को आप की जरूरत है कि है। बस उन दोनों को लिंकर को पास करें और इसे बाकी

$ g++ try.o try1.o 
$ 

कोई त्रुटि नहीं !! ऐसा इसलिए है क्योंकि लिंकर को सभी कार्यों की परिभाषाएं मिलती हैं (भले ही यह विभिन्न ऑब्जेक्ट फ़ाइलों में बिखरी हुई हो) और उचित मानों के साथ ऑब्जेक्ट कोड में रिक्त स्थान भरें

+0

आपने इसे रेडबर्न ने खींचा! इस महान स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। – madu

4

मेरा मानना ​​है कि यह आपके सवाल यह है:

कहाँ मैं भ्रमित हो जाता है जब संकलक DefinedIncorrectFunction बारे में शिकायत की। यह NonDefinedFunction के कार्यान्वयन की तलाश नहीं करता था लेकिन यह DefinedIncorrectFunction के माध्यम से चला गया।

संकलक (क्योंकि आप इस स्रोत फ़ाइल में एक परिभाषा प्रदान की) और एक सिंटैक्स त्रुटि (लापता अर्धविराम) वहाँ था DefinedIncorrectFunction पार्स करने के लिए कोशिश की। दूसरी तरफ, कंपाइलर ने कभी भी NonDefinedFunction की परिभाषा नहीं देखी क्योंकि इस मॉड्यूल में बस कोई कोड नहीं था। आपने किसी अन्य स्रोत फ़ाइल में NonDefinedFunction की परिभाषा प्रदान की हो सकती है, लेकिन संकलक इसे नहीं जानता है।संकलक केवल एक समय में एक स्रोत फ़ाइल (और इसमें शामिल हेडर फाइल) देखता है।

2

कंपाइलर जांचता है कि स्रोत कोड भाषा अनुरूप है और भाषा के अर्थशास्त्र का पालन करता है। कंपाइलर से आउटपुट ऑब्जेक्ट कोड है।

लिंकर एक एक्सई बनाने के लिए अलग-अलग ऑब्जेक्ट मॉड्यूल को एक साथ जोड़ता है। कार्यों की परिभाषा इस चरण में स्थित है और उन्हें कॉल करने के लिए उपयुक्त कोड इस चरण में जोड़ा गया है।

कंपाइलर translation units के रूप में कोड संकलित करता है। यह स्रोत .cpp फ़ाइल में शामिल सभी कोड संकलित करेगा,
DefinedIncorrectFunction() आपकी स्रोत फ़ाइल में परिभाषित किया गया है, इसलिए कंपाइलर भाषा वैधता के लिए इसकी जांच करता है।
NonDefinedFunction() में स्रोत फ़ाइल में कोई परिभाषा है इसलिए संकलक को संकलित करने की आवश्यकता नहीं है, अगर परिभाषा किसी अन्य स्रोत फ़ाइल में मौजूद है, तो फ़ंक्शन उस अनुवाद इकाई के हिस्से के रूप में संकलित किया जाएगा और आगे लिंकर लिंक करेगा इसके लिए, यदि लिंक जोड़ने पर परिभाषा लिंकर द्वारा नहीं मिलती है तो यह एक लिंकिंग त्रुटि उठाएगी।

+0

धन्यवाद अलस। अनुवाद इकाई अवधारणा ने इसे मेरे लिए मंजूरी दे दी। यदि इसमें शामिल है तो इसे कंपाइलर द्वारा चेक किया जाएगा। – madu

1

गायब अर्द्ध-कोलन एक वाक्यविन्यास त्रुटि है और इसलिए कोड संकलित नहीं होना चाहिए। यह एक टेम्पलेट कार्यान्वयन में भी हो सकता है। अनिवार्य रूप से, एक पार्सिंग चरण होता है और जब यह एक इंसान के लिए स्पष्ट होता है कि एक कंपाइलर को "ठीक करने और ठीक करने" के लिए ऐसा करने की ज़रूरत नहीं है। यह सिर्फ "अर्ध-कॉलन की कल्पना नहीं कर सकता क्योंकि यह तुम्हारा मतलब है" और जारी रखें।

एक लिंकर फ़ंक्शन परिभाषाओं को देखने के लिए देखता है जहां उन्हें आवश्यकता होती है। यहां इसकी आवश्यकता नहीं है इसलिए कोई शिकायत नहीं है। इस फ़ाइल में इस तरह की कोई त्रुटि नहीं है, भले ही इसकी आवश्यकता हो, लेकिन यह इस विशेष संकलन इकाई में लागू नहीं किया जा सकता है। लिंकर विभिन्न संकलन इकाइयों को एकत्रित करने के लिए ज़िम्मेदार है, यानी उन्हें "लिंक करना"।

1

आह, लेकिन आप किसी अन्य संकलन इकाई में NonDefinedFunction (int) प्राप्त कर सकते हैं।

  • कौन सा प्रतीक (कार्यों/चर/आदि) परिभाषित कर रहे हैं:

    संकलक कि मूल रूप से निम्नलिखित कहते हैं (अन्य बातों के अलावा) लिंकर के लिए कुछ उत्पादन पैदा करता है।

  • कौन से प्रतीकों का संदर्भ दिया गया है लेकिन अपरिभाषित है। इस मामले में लिंकर को लिंक किए जा रहे अन्य मॉड्यूल के माध्यम से संदर्भों को हल करने की आवश्यकता है। यदि यह नहीं हो सकता है, तो आपको एक लिंकर त्रुटि मिलती है।
4

कहें कि आप कुछ सूप खाना चाहते हैं, तो आप एक रेस्तरां में जाते हैं।

आप सूप के लिए मेनू खोजते हैं। यदि आपको मेनू में नहीं मिलता है, तो आप रेस्तरां छोड़ देते हैं। (एक संकलक की तरह शिकायत करने से यह फ़ंक्शन नहीं मिल सका) यदि आपको लगता है, तो आप क्या करते हैं?

आप वेटर को कुछ सूप पाने के लिए बुलाते हैं। हालांकि, सिर्फ इसलिए कि यह मेनू में है, इसका मतलब यह नहीं है कि वे रसोईघर में भी हैं। पुराना मेनू हो सकता है, यह हो सकता है कि कोई शेफ को बताना भूल गया कि उसे सूप बनाना है। तो फिर, तुम जाओ। (लिंकर से एक त्रुटि की तरह कि यह प्रतीक नहीं मिला)

+0

इसे लुचियान रखने का एक अच्छा तरीका है। धन्यवाद। – madu

1

लिंकर बाहरी मॉड्यूल में परिभाषित कोड (संभवतः) में लिंक करने के लिए है - लाइब्रेरी या ऑब्जेक्ट फाइल जो आप इस विशेष स्रोत फ़ाइल के साथ एक साथ उपयोग करेंगे पूर्ण निष्पादन योग्य उत्पन्न करें। इसलिए, यदि आपके पास कोई घोषणा है लेकिन कोई परिभाषा नहीं है, तो आपका कोड संकलित होगा क्योंकि संकलक जानता है कि लिंकर कहीं और गायब कोड ढूंढ सकता है और इसे काम कर सकता है।इसलिए, इस मामले में आपको लिंकर से कोई त्रुटि मिलेगी, न कि संकलक।

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

नियमित कोड के साथ, कंपाइलर को भी मृत कोड (कोड को आपकी स्रोत फ़ाइल में संदर्भित नहीं किया जाना चाहिए) को संकलित करना चाहिए क्योंकि कोई भी आपके कोड को अपने .o फ़ाइल को लिंक करके किसी अन्य स्रोत फ़ाइल से उस कोड का उपयोग करना चाहता है। इसलिए गैर-टेम्पलेट/मैक्रो कोड को सिंटैक्टिक रूप से सही होना चाहिए, भले ही इसे सीधे उसी स्रोत फ़ाइल में उपयोग न किया जाए।

+1

नहीं, टेम्पलेट्स इस तरह से काम नहीं करते हैं। वे दो चरणों में संकलित हैं। पहले चरण में, टेम्पलेट पैरामीटर पर निर्भर नहीं होने वाली सभी चीजें संकलित की जाती हैं, दूसरे चरण में टेम्पलेट पैरामीटर भर जाते हैं। असंतुलित कोष्ठक (एक स्पष्ट वाक्यविन्यास त्रुटि नाम देने के लिए) चरण 1 में पाए जाते हैं, क्योंकि कोई प्रतिस्थापन उन्हें ठीक नहीं कर सकता है । – MSalters

+0

@MSalters मुझे लगता है कि एक संकलक टेम्पलेट्स को कैसे संसाधित करता है इस संबंध में मानक बहुत अधिक छूट देता है। टेम्पलेट समाप्त होता है (जिसके लिए प्रसंस्करण कोष्ठक की आवश्यकता होती है) यह जानने के लिए सामने पर्याप्त प्रसंस्करण करना चाहिए, और इसे बहुत विशिष्ट नियमों के अनुसार टेम्पलेट में नामों को हल करना होगा, लेकिन मुझे नहीं लगता कि संकलक को डायग्नोस्टिक जारी करने की आवश्यकता है यदि टेम्पलेट तत्काल नहीं है तो यह एक गैर-निर्भर प्रतीक नहीं ढूंढ सकता है। (अभ्यास में, जी ++ करता है, वीसी ++ नहीं करता है।) –

+0

@ जेम्ससांज: यह काफी प्रसिद्ध है कि वीसी ++ में मानक के उल्लंघन में केवल टेम्पलेट्स का एक चरण तत्काल है। विशेष रूप से, यह उस क्षेत्र में प्रतीकों को देखने में विफल रहता है जहां टेम्पलेट परिभाषित किया गया है, भले ही यह आवश्यक हो। जाहिर है, इसका मतलब है कि इसे टेम्पलेट्स को उस बिंदु पर पार्स करना है जहां यह जानता है कि एक पहचानकर्ता को आसपास के दायरे में देखा जाना चाहिए। – MSalters

2

कंपाइलर क्या करता है, और लिंकर क्या करता है, इस पर निर्भर करता है कार्यान्वयन: एक कानूनी कार्यान्वयन सिर्फ “ संकलक ” में tokenized स्रोत संग्रहीत कर सकती है, और लिंकर में सब कुछ करना। आधुनिक कार्यान्वयन बेहतर अनुकूलन के लिए, लिंकर को अधिक से अधिक डालें।और टेम्पलेट्स के कई शुरुआती कार्यान्वयन टेम्पलेट समाप्त होने के बारे में जानने के लिए पर्याप्त ब्रेसिज़ मिलान करने के अलावा लिंक समय तक टेम्पलेट कोड भी नहीं देखते थे। उपयोगकर्ता के दृष्टिकोण से, आपको “ त्रुटि डायग्नोस्टिक ” (जिसे कंपाइलर या लिंकर द्वारा उत्सर्जित किया जा सकता है) या अनिर्धारित व्यवहार की आवश्यकता है, इस बारे में अधिक रुचि रखते हैं।

DefinedIncorrectFunction के मामले में, आपने स्रोत टेक्स्ट प्रदान किया है जो कार्यान्वयन को पार्स करने की आवश्यकता है। उस पाठ में त्रुटि है जिसके लिए निदान की आवश्यकता है। NonDefinedFunction के मामले में: यदि फ़ंक्शन का उपयोग किया जाता है, तो परिभाषा (या एक से अधिक परिभाषा प्रदान करने) में प्रोग्राम में विफलता एक परिभाषा नियम का उल्लंघन है, जो व्यवहार को अपरिभाषित है। कोई निदान की आवश्यकता नहीं है (लेकिन मैं कार्यान्वयन की कल्पना नहीं कर सकता जो कि फ़ंक्शन का उपयोग करने वाली अनुपलब्ध परिभाषा के लिए एक प्रदान नहीं करता था)।

अभ्यास में, त्रुटियों जो आसानी से एक भी अनुवाद इकाई के पाठ इनपुट का परीक्षण करके बस पता लगाया जा सकता करने के लिए मानक द्वारा परिभाषित कर रहे “ एक नैदानिक ​​” की आवश्यकता होती है, और संकलक द्वारा पता लगाया जाएगा। एकल अनुवाद इकाई (उदाहरण के लिए एक लापता परिभाषा, जो एक अलग अनुवाद इकाई में मौजूद हो सकती है) की जांच द्वारा पता नहीं लगाया जा सकता है) कई मामलों में औपचारिक रूप से व्यवहार — को अनदेखा कर दिया गया है, त्रुटियों को लिंकर द्वारा पता लगाया जा सकता है, और ऐसे मामलों में, कार्यान्वयन वास्तव में एक त्रुटि को छोड़ देगा।

यह कुछ हद तक इनलाइन काम करता है, जहां प्रत्येक अनुवाद इकाई में परिभाषा को दोहराने के लिए अनुमति दी है, और अत्यंत , टेम्पलेट्स द्वारा संशोधित के बाद से कई त्रुटियों इन्स्टेन्शियशन जब तक पता नहीं लगाया जा सकता है कर रहे हैं तरह के मामलों में संशोधित किया गया है। टेम्पलेट्स के मामले में, मानक पत्तियां कार्यान्वयन स्वतंत्रता का एक बड़ा सौदा: कम से कम, संकलक टेम्पलेट को समाप्त करने के लिए पर्याप्त टेम्पलेट को पार्स करना चाहिए। मानक जोड़ा गया चीजें जैसे typename, हालांकि, तत्कालता से पहले पार्सिंग की अनुमति देने के लिए। निर्भर संदर्भों में, हालांकि, त्रुटियों को तत्कालता से पहले पता नहीं लगाया जा सकता है, जो संकलन समय पर या लिंक समय — प्रारंभिक कार्यान्वयन पसंदीदा लिंक समय तत्कालता में ले सकता है; संकलन समय त्वरण आज पर हावी है, और इसका उपयोग वीसी ++ और जी ++ द्वारा किया जाता है।

+0

उस विस्तृत स्पष्टीकरण जेम्स के लिए बहुत बहुत धन्यवाद। – madu

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