बाहरी लिंकेज और आंतरिक लिंकेज क्या है?


337

मैं बाहरी लिंकेज और आंतरिक लिंकेज और उनके अंतर को समझना चाहता हूं।

मैं इसका अर्थ भी जानना चाहता हूं

constजब तक अन्यथा घोषित नहीं किया जाता है तब तक डिफ़ॉल्ट रूप से आंतरिक रूप से लिंक चर extern

जवाबों:


279

जब आप एक कार्यान्वयन फ़ाइल ( .cppऔर .cxx, आदि) लिखते हैं , तो आपका संकलक एक अनुवाद इकाई बनाता है । यह आपके कार्यान्वयन से स्रोत फ़ाइल है और साथ ही आप इसमें शामिल सभी हेडर भी #include

आंतरिक संबंध केवल अनुवाद इकाई के दायरे में सब कुछ संदर्भित करता है ।

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


112
मैं इसे एक गड़बड़ के अलावा छोड़ दूंगा: एक अनुवाद इकाई "किसी तरह ऑब्जेक्ट फ़ाइल" नहीं है, यह स्रोत कोड है जिसमें से कंपाइलर ऑब्जेक्ट फ़ाइल बनाता है।
sbi

4
@FrankHB, "कुछ और महत्वपूर्ण" क्या है जो उत्तर गायब है?
गणितज्ञ

2
@ मैथेमेटिशियन सॉरी फॉर लेट ... मुझे लगता है कि समस्या स्पष्ट होनी चाहिए (शब्दांकन की सटीकता के अलावा)। यह उत्तर अधूरा है, क्योंकि constचर के नियम (साथ ही इसका उद्देश्य) के बारे में सवाल पूरी तरह से यहाँ याद किया जाता है।
फ्रैंकएचबी

293

जैसा कि dudewat ने कहा कि बाहरी लिंकेज का मतलब है कि प्रतीक (फ़ंक्शन या वैश्विक चर) आपके पूरे कार्यक्रम में उपलब्ध है और आंतरिक लिंकेज का मतलब है कि यह केवल एक अनुवाद इकाई में ही सुलभ है ।

आप कीवर्ड externऔर staticकीवर्ड का उपयोग करके किसी प्रतीक के लिंक को स्पष्ट रूप से नियंत्रित कर सकते हैं । यदि लिंकेज निर्दिष्ट नहीं है, तो डिफ़ॉल्ट लिंकेज externगैर- constप्रतीकों और प्रतीकों के लिए static(आंतरिक) के लिए constहै।

// in namespace or global scope
int i; // extern by default
const int ci; // static by default
extern const int eci; // explicitly extern
static int si; // explicitly static

// the same goes for functions (but there are no const functions)
int foo(); // extern by default
static int bar(); // explicitly static 

ध्यान दें कि staticआंतरिक लिंकेज के लिए उपयोग करने के बजाय अनाम नामस्थान का उपयोग करना बेहतर है जिसमें आप भी डाल सकते हैं class। अनाम नामस्थान के लिए लिंक C ++ 98 और C ++ 11 के बीच बदल गया है, लेकिन मुख्य बात यह है कि वे सभी अनुवाद इकाइयों से उपलब्ध नहीं हैं।

namespace {
   int i; // external linkage but unreachable from other translation units.
   class invisible_to_others { };
}

11
"निर्यात" कीवर्ड के कार्यान्वयन ने 'स्टेटिक' घोषित किए गए फ़ंक्शन और अनाम नामस्थान में घोषित फ़ंक्शन के बीच अंतर को उजागर किया। सर्वश्रेष्ठ के रूप में संक्षेप में प्रस्तुत करने के लिए, एक अनुवाद इकाई में निर्यात कीवर्ड के साथ घोषित एक फ़ंक्शन टेम्पलेट 2-चरण लुकअप के परिणामस्वरूप एक भिन्न अनुवाद इकाई के अनाम नामस्थान में परिभाषित फ़ंक्शन को संदर्भित कर सकता है। ( ddj.com/showArticle.jhtml?articleID=184401584 )
रिचर्ड कॉर्डन

अगर मैं निम्नलिखित करूं तो: 1.cpp <code> const int ci; </ code> 2.cpp <code> extern const int ci; </ code>
राजेंद्र उप्पल

2
@ राजेंडा आपको एक अप्रत्‍याशित प्रतीक त्रुटि (नौ महीने की देरी के लिए खेद है कि मैं इस टिप्‍पणी के उत्तर देने में चूक गया)।
मत्ती

4
जानकारी जो इस उत्तर को बहुत बढ़ा सकती है: 1) स्थैतिक को C ++ 11 में अब और नहीं चित्रित किया गया है। 2) C ++ 11 में अनाम नाम स्थान के सदस्यों में डिफ़ॉल्ट रूप से आंतरिक संबंध हैं। देखें stackoverflow.com/questions/10832940/...
Klaim

2
इसका क्या मतलब है "बाहरी संपर्क लेकिन अन्य अनुवाद इकाइयों से अगम्य"? यह अगम्य लेकिन फिर भी बाहरी कैसे हो सकता है?
szx

101
  • वैश्विक चर में डिफ़ॉल्ट रूप से बाहरी लिंकेज होता है। इसका दायरा अन्य फाइलों में मेल खाते हुए externघोषणा के साथ इसे रखने के अलावा अन्य फाइलों तक बढ़ाया जा सकता है ।
  • एक वैश्विक चर का दायरा उस फ़ाइल के लिए प्रतिबंधित किया जा सकता है जिसमें कीवर्ड के साथ घोषणा को उपसर्ग करके इसकी घोषणा है static। ऐसे चर को आंतरिक जुड़ाव कहा जाता है ।

निम्नलिखित उदाहरण पर विचार करें:

1.cpp

void f(int i);
extern const int max = 10;
int n = 0;
int main()
{
    int a;
    //...
    f(a);
    //...
    f(a);
    //...
}
  1. फ़ंक्शन का हस्ताक्षर बाहरी लिंकेज (डिफ़ॉल्ट) के साथ एक फ़ंक्शन के रूप में fघोषित fकरता है । इसकी परिभाषा बाद में इस फ़ाइल या अन्य अनुवाद इकाई (नीचे दी गई) में प्रदान की जानी चाहिए।
  2. maxपूर्णांक स्थिरांक के रूप में परिभाषित किया गया है। स्थिरांक के लिए डिफ़ॉल्ट लिंकेज आंतरिक है । इसका लिंकेज कीवर्ड के साथ बाहरी में बदल जाता है extern। तो अब maxअन्य फ़ाइलों में पहुँचा जा सकता है।
  3. nपूर्णांक चर के रूप में परिभाषित किया गया है। फ़ंक्शन निकायों के बाहर परिभाषित चर के लिए डिफ़ॉल्ट लिंकेज बाहरी है

2.cpp

#include <iostream>
using namespace std;

extern const int max;
extern int n;
static float z = 0.0;

void f(int i)
{
    static int nCall = 0;
    int a;
    //...
    nCall++;
    n++;
    //...
    a = max * z;
    //...
    cout << "f() called " << nCall << " times." << endl;
}
  1. maxबाहरी लिंकेज के लिए घोषित किया जाता है । max(बाहरी लिंकेज के साथ) एक मिलान परिभाषा कुछ फ़ाइल में दिखाई देनी चाहिए। (1.cpp में)
  2. nबाहरी लिंकेज होने की घोषणा की गई है ।
  3. zआंतरिक लिंकेज के साथ एक वैश्विक चर के रूप में परिभाषित किया गया है ।
  4. nCallनिर्दिष्ट nCallकरने की परिभाषा एक चर है जो फ़ंक्शन पर कॉल करने के लिए इसके मूल्य को बरकरार रखती है f()। डिफॉल्ट ऑटो स्टोरेज क्लास वाले स्थानीय वैरिएबल्स के विपरीत nCall, प्रोग्राम के शुरू में केवल एक बार इनिशियलाइज़ किया जाएगा और प्रत्येक इनवोकेशन के लिए एक बार नहीं f()। भंडारण वर्ग विनिर्देशक staticस्थानीय चर के जीवनकाल को प्रभावित करता है और इसके दायरे को नहीं।

NB: कीवर्ड staticएक दोहरी भूमिका निभाता है। वैश्विक चर की परिभाषाओं में उपयोग किए जाने पर, यह आंतरिक लिंकेज को निर्दिष्ट करता है । जब स्थानीय चर की परिभाषाओं में उपयोग किया जाता है, तो यह निर्दिष्ट करता है कि चर का जीवनकाल कार्य की अवधि होने के बजाय कार्यक्रम की अवधि होने वाली है।

उम्मीद है की वो मदद करदे!


2
महत्वपूर्ण रूप से, जब स्थानीय चर की परिभाषाओं में उपयोग किया जाता है, तो staticआलसी एकल आरंभीकरण की अनुमति देता है (जो उपयोगी हो सकता है यदि आपको वैश्विक-ईश ऑब्जेक्ट की आवश्यकता है लेकिन वैश्विक निर्माण आदेश के साथ मुद्दों के कारण निर्मित होने पर इसे नियंत्रित करना होगा और गतिशील रूप से इसे आवंटित नहीं कर सकता है। newइन-डेप्थ इनिशियलाइज़ेशन स्कीमों का अधिक से अधिक उपयोग करना, प्रश्न में ऑब्जेक्ट के लिए आवश्यक चीज़ों से परे हो सकता है; निहितार्थ, यह मुख्य रूप से एम्बेडेड सिस्टम पर एक मुद्दा है जो C ++ का उपयोग करता है)।
JAB

1
बहुत अच्छा एग्जाम, मेरा दिन बना।
रक्त- HaZaRd

28

'C' के संदर्भ में (क्योंकि स्थैतिक कीवर्ड का 'C' और 'C ++' के बीच भिन्न अर्थ है)

'C' में विभिन्न स्कोप के बारे में बात करते हैं

SCOPE: यह मूल रूप से मैं कब तक कुछ देख सकता हूं और कितनी दूर है।

  1. स्थानीय चर: स्कोप केवल एक फ़ंक्शन के अंदर होता है। यह RAM के STACK क्षेत्र में रहता है। जिसका अर्थ है कि हर बार किसी फ़ंक्शन को उन सभी चर कहा जाता है जो उस फ़ंक्शन का हिस्सा होते हैं, जिसमें फ़ंक्शन तर्कों को नए सिरे से बनाया जाता है और नियंत्रण से बाहर जाने के बाद नष्ट हो जाते हैं। (क्योंकि स्टैक को हर बार फंक्शन रिटर्न में फ्लश किया जाता है)

  2. स्टेटिक वैरिएबल: इसका स्कोप किसी फाइल के लिए होता है। यह उस फ़ाइल
    में हर जगह पहुँचा जा सकता है जिसमें यह घोषित किया गया है। यह RAM के DATA सेगमेंट में रहता है। चूंकि यह केवल एक फ़ाइल के अंदर पहुँचा जा सकता है और इसलिए इंटरनल लिंक है। कोई भी
    अन्य फ़ाइल इस चर को नहीं देख सकती है। वास्तव में STATIC कीवर्ड ही एकमात्र तरीका है जिसमें हम
    'C' में कुछ स्तर के डेटा या फ़ंक्शन को छिपा सकते हैं।

  3. ग्लोबल वैरिएबल: इसका स्कोप एक संपूर्ण एप्लिकेशन के लिए है। यह एप्लिकेशन के प्रत्येक स्थान पर पहुंच योग्य है। वैश्विक चर भी DATA सेगमेंट में रहते हैं क्योंकि इसे एप्लिकेशन में हर जगह एक्सेस किया जा सकता है और इसलिए EXTERNAL लिंकेज

डिफ़ॉल्ट रूप से सभी कार्य वैश्विक हैं। यदि आपको बाहर से किसी फ़ाइल में कुछ फ़ंक्शंस छिपाने की आवश्यकता है, तो आप स्टेटिक कीवर्ड को फ़ंक्शन में प्रीफ़िक्स कर सकते हैं। :-)


12
@ लिबिन: 1 के रूप में) स्थानीय चर स्टैक पर नहीं होते हैं - वे आमतौर पर स्टैक पर होते हैं लेकिन रजिस्टरों में हो सकते हैं और एआरएम वातावरण में वे स्टैक की तुलना में रजिस्टरों में अधिक बार होते हैं (कुछ कारकों पर निर्भर करता है - कॉल स्तर, संख्या औपचारिक args ..)
Artur

4
@ लिबिन: 1 के रूप में) यदि आप 'फ्लश' को ओवरराइट मानते हैं - यह गलत है। स्टैक पॉइंटर को सिर्फ अलग जगह पर ले जाया जाता है। कोई 'पहले मान्य स्थानीय संस्करण' 'फ्लश' / क्लियर किए गए आदि नहीं हैं। आप स्टोरेज अवधि के साथ वेरिएबल स्कोप को मिलाते हैं। स्कोप बताता है कि आप कहां से एक var का उपयोग कर सकते हैं। संग्रहण अवधि बताती है कि यह कितने समय से मौजूद है। आपके पास स्थिर संग्रहण अवधि के साथ स्थानीय चर हो सकते हैं। इसका मतलब है कि यह "हमेशा के लिए" रहता है, लेकिन इसे एक फ़ंक्शन से एक्सेस किया जा सकता है, जिसमें यह घोषित है।
आर्टूर

2
गलत अवधारणाओं और स्पष्ट गलत धारणाओं के लिए पतन। कड़ाई से बोलते हुए, सी में परिभाषित कोई "वैश्विक" और न ही "चर" (एक संज्ञा के रूप में) है। आप शायद "वैश्विक चर" के बजाय "फ़ाइल स्कोप ऑब्जेक्ट" को संदर्भित करना चाहते हैं, लेकिन "गुंजाइश" के बारे में बात कर रहे हैं (सी में) एक पहचानकर्ता की संपत्ति है ) यह बकवास है। (दोनों शब्दों को C ++ में थोड़े अलग अर्थों के साथ प्रामाणिक रूप से परिभाषित किया गया है।)
फ्रैंकहब

@Artur मुझे लगता है कि आप " केवल " को भूल गए " इसका मतलब है कि यह" हमेशा के लिए "रहता है लेकिन इसे घोषित किए गए फ़ंक्शन से (केवल) एक्सेस किया जा सकता है। " - यह एक महत्वपूर्ण विवरण है, इसलिए मैं इंगित करना चाहता हूं। कि स्पष्ट रूप से बाहर।
रॉबर्ट्स

14

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

मैं कुछ प्रमुख बिंदुओं पर जोर दूंगा, esp। पिछले उत्तरों में जो गायब हैं।

लिंकेज एक नाम की एक संपत्ति है , जिसे एक घोषणा द्वारा पेश किया जाता है । अलग-अलग नाम एक ही इकाई (आमतौर पर, एक वस्तु या एक फ़ंक्शन) को निरूपित कर सकते हैं । इसलिए एक इकाई के संबंध के बारे में बात करना आमतौर पर बकवास है, जब तक कि आप सुनिश्चित नहीं हैं कि इकाई केवल कुछ विशिष्ट घोषणाओं (आमतौर पर एक घोषणा, हालांकि) से अद्वितीय नाम से संदर्भित की जाएगी।

नोट एक वस्तु एक इकाई है, लेकिन एक चर नहीं है। एक चर के लिंकेज के बारे में बात करते समय, वास्तव में निरूपित इकाई का नाम (जो एक विशिष्ट घोषणा द्वारा पेश किया गया है) संबंधित है। नाम का लिंकेज तीन में से एक में है: कोई लिंकेज, आंतरिक लिंकेज या बाहरी लिंकेज नहीं।

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

(उफ्फ ... मैंने पाया कि जो मैंने टाइप किया है वह कुछ हद तक मानक शब्द को दोहरा रहा था ...)

कुछ अन्य भ्रमित करने वाले बिंदु भी हैं जो भाषा विनिर्देश द्वारा कवर नहीं किए गए हैं।

  1. दृश्यता (एक नाम)। यह घोषित नाम की एक संपत्ति भी है, लेकिन लिंकेज के लिए अलग अर्थ है
  2. दृश्यता (एक पक्ष प्रभाव) । यह इस विषय से संबंधित नहीं है।
  3. दृश्यता (प्रतीक का)। इस धारणा का उपयोग वास्तविक कार्यान्वयन द्वारा किया जा सकता है । ऐसे कार्यान्वयन में, ऑब्जेक्ट (बाइनरी) कोड में विशिष्ट दृश्यता वाला एक प्रतीक आमतौर पर इकाई परिभाषा से मैप किया गया लक्ष्य होता है जिनके नाम स्रोत (C ++) कोड में समान विशिष्ट लिंकेज होते हैं। हालांकि, यह आमतौर पर एक-से-एक की गारंटी नहीं है। उदाहरण के लिए, डायनेमिक लाइब्रेरी छवि में एक प्रतीक केवल उस छवि में स्रोत कोड से आंतरिक रूप से साझा किया जा सकता है (कुछ एक्सटेंशन, आमतौर पर __attribute__या इसके साथ शामिल)__declspec) या संकलक विकल्प, और छवि पूरे प्रोग्राम या ट्रांसलेशन यूनिट से अनुवादित ऑब्जेक्ट फ़ाइल नहीं है, इस प्रकार कोई भी मानक अवधारणा इसका सही वर्णन नहीं कर सकती है। चूँकि C ++ में प्रतीक एक आदर्श शब्द नहीं है, यह केवल एक कार्यान्वयन विवरण है, भले ही बोलियों के संबंधित विस्तार को व्यापक रूप से अपनाया गया हो।
  4. सरल उपयोग। सी ++ में, यह आमतौर पर वर्ग के सदस्यों या आधार वर्गों की संपत्ति के बारे में होता है, जो फिर से विषय के लिए असंबंधित एक अलग अवधारणा है।
  5. वैश्विक। C ++ में, "वैश्विक" वैश्विक नामस्थान या वैश्विक नामस्थान गुंजाइश के कुछ को संदर्भित करता है। बाद वाली सी भाषा में फ़ाइल स्कोप के बराबर है । सी और सी ++ दोनों में, लिंकेज का स्कोप से कोई लेना-देना नहीं है, हालांकि स्कोप (जैसे लिंकेज) भी कुछ घोषणा द्वारा शुरू किए गए पहचानकर्ता (सी में) या एक नाम (सी ++ में) के साथ कसकर संबंधित है।

नाम स्थान दायरे से संबंध नियम constचर कुछ खास (और विशेष रूप से करने के लिए अलग है constवस्तु सी भाषा जो भी पहचानकर्ता के लिंकेज की अवधारणा है में फ़ाइल दायरे में घोषित)। चूंकि ओडीआर सी द्वारा लागू की जाती ++, यह एक ही चर या समारोह में से एक परिभाषा से अधिक नहीं रखने के लिए के लिए छोड़कर पूरे कार्यक्रम में हुई महत्वपूर्ण है inlineकार्यों । यदि ऐसा कोई विशेष नियम नहीं है const, तो हेडर या स्रोत फ़ाइल (प्रायः "हेडर फ़ाइल") में कई अनुवाद इकाइयों द्वारा शामिल (या एक से अधिक अनुवाद इकाई द्वारा एक बार शामिल किया गया) हेडर या स्रोत फ़ाइल के constसाथ चर का एक सरल घोषणा। = xxxहालांकि शायद ही कभी) एक कार्यक्रम में ओडीआर का उल्लंघन करेगा, जो उपयोग करने के लिए बनाता हैconst चर के रूप में कुछ वस्तु के प्रतिस्थापन की तरह मैक्रोज़ असंभव।


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

8

मुझे लगता है कि C ++ में आंतरिक और बाहरी संबंध स्पष्ट और संक्षिप्त विवरण देता है:

एक अनुवाद इकाई एक कार्यान्वयन (.c / .cpp) फ़ाइल को संदर्भित करती है और इसमें शामिल सभी हेडर (.h / .hpp) फाइलें। यदि ऐसी अनुवाद इकाई के अंदर किसी ऑब्जेक्ट या फ़ंक्शन में आंतरिक लिंकेज है, तो वह विशिष्ट प्रतीक केवल उस अनुवाद इकाई के भीतर लिंकर को दिखाई देता है। यदि किसी ऑब्जेक्ट या फ़ंक्शन में बाहरी लिंकेज है, तो लिंकर अन्य ट्रांसलेशन इकाइयों को संसाधित करते समय भी देख सकता है। स्थिर नाम, जब वैश्विक नामस्थान में उपयोग किया जाता है, तो प्रतीक को आंतरिक लिंकेज के लिए मजबूर करता है। बाहरी कीवर्ड में बाहरी लिंकेज वाले प्रतीक होते हैं।

संकलक प्रतीकों के लिंक को इस तरह से परिभाषित करता है:

नॉन-कास्ट ग्लोबल वेरिएबल्स में डिफॉल्ट रूप से बाहरी लिंकेज होता है
कॉन्स्टेबल ग्लोबल वैरिएबल्स में इंटरनल लिंकेज होता है डिफॉल्ट में
फंक्शंस में बाहरी लिंकेज डिफॉल्ट रूप से होता है


6

लिंकेज निर्धारित करता है कि क्या समान नाम, पहचानकर्ता समान ऑब्जेक्ट, फ़ंक्शन या अन्य इकाई को संदर्भित करते हैं, भले ही वे पहचानकर्ता विभिन्न अनुवाद इकाइयों में दिखाई देते हों। एक पहचानकर्ता का जुड़ाव इस बात पर निर्भर करता है कि इसे कैसे घोषित किया गया था। लिंकेज तीन प्रकार के होते हैं:

  1. आंतरिक लिंकेज : पहचानकर्ताओं को केवल अनुवाद इकाई के भीतर देखा जा सकता है।
  2. बाहरी लिंकेज : पहचानकर्ताओं को अन्य अनुवाद इकाइयों में देखा (और संदर्भित) किया जा सकता है।
  3. कोई लिंकेज नहीं : पहचानकर्ताओं को केवल उस दायरे में देखा जा सकता है जिसमें उन्हें परिभाषित किया गया है। लिंकेज स्कूपिंग को प्रभावित नहीं करता है

C ++ केवल : आप C ++ और गैर- C ++ कोड अंशों के बीच संबंध भी बना सकते हैं, जिसे भाषा लिंकेज कहा जाता है ।

स्रोत: आईबीएम कार्यक्रम लिंकेज


5

मूल रूप से

  • extern linkage चर सभी फ़ाइलों में दिखाई देता है
  • internal linkage चर एकल फ़ाइल में दिखाई देता है।

समझाएं: जब तक अन्यथा बाहरी घोषित नहीं किया जाता है तब तक कॉन्स्टेबल चर डिफ़ॉल्ट रूप से लिंक करते हैं

  1. डिफ़ॉल्ट रूप से, वैश्विक चर है external linkage
  2. लेकिन, constवैश्विक परिवर्तनशील हैinternal linkage
  3. अतिरिक्त, extern constवैश्विक परिवर्तनशील हैexternal linkage

सी ++ में लिंकेज के बारे में एक बहुत अच्छी सामग्री

http://www.goldsborough.me/c/c++/linker/2016/03/30/19-34-25-internal_and_external_linkage_in_c++/


1

C ++ में

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

वैश्विक चर और साधारण कार्यों में बाहरी संबंध हैं।

फ़ाइल क्षेत्र में स्टेटिक ऑब्जेक्ट या फ़ंक्शन का नाम अनुवाद इकाई के लिए स्थानीय है। इसे इंटरनल लिंकेज कहा जाता है

लिंकेज केवल उन तत्वों को संदर्भित करता है जिनके लिंक / लोड समय पर पते हैं; इस प्रकार, वर्ग घोषणाओं और स्थानीय चर का कोई संबंध नहीं है।


कास्ट ग्लोबल वैर में इंटरनल लिंकेज है।
रक्त-हैजर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.