2012-10-19 24 views
18

सी पुस्तक में, यह कहते हैं:क्या कोई आंतरिक/बाहरी चर नामों को समझा सकता है?

कम से कम एक आंतरिक नाम के पहले 31 वर्णों महत्वपूर्ण हैं। फ़ंक्शन नाम और बाहरी चर के लिए, संख्या 31 से कम हो सकती है, क्योंकि बाहरी नामों का उपयोग असेंबलरों और लोडर द्वारा किया जा सकता है जिन पर भाषा का कोई नियंत्रण नहीं होता है। बाहरी नामों के लिए, मानक केवल 6 वर्णों और एक ही मामले के लिए विशिष्टता की गारंटी देता है। जैसे कीवर्ड, अन्य, int, float, आदि आरक्षित हैं: आप उन्हें चर नामों के रूप में उपयोग नहीं कर सकते हैं। वे कम मामले में होना चाहिए।

क्या कोई बता सकता है कि "आंतरिक नाम", "बाहरी नाम", "बाहरी चर" क्या है? यदि आप एक उदाहरण बना सकते हैं तो यह बेहतर होगा।

+1

कौन सी "सी पुस्तक"? क्या इसे वास्तव में "एएनएसआई सी" कहा जाता है? – asteri

+0

@ जेफ "द सी बुक" नामक एक पुस्तक है - http://www.amazon.com/The-Book- विशेषता- मानक- निर्देश/डीपी/0201544334 मुझे संदेह है कि यह ओपी का जिक्र है। –

+0

यह सी 8 9/सी 9 0 मानक सीमा है; सी 99 मानक उन सीमाओं को बढ़ाता है (_63 आंतरिक पहचानकर्ता या मैक्रो नाम में महत्वपूर्ण प्रारंभिक वर्ण ... बाहरी पहचानकर्ता में महत्वपूर्ण प्रारंभिक वर्ण ..._) नामों में सार्वभौमिक चरित्र नामों के बारे में कुछ चेतावनियों के साथ। सी2011 के लिए सीमाएं समान हैं। ध्यान दें कि सी 99 मानक को केस-सेंसिटीविटी की आवश्यकता होती है जहां मूल सी 8 9 मानक नहीं था। –

उत्तर

1

"आंतरिक नाम" फ़ंक्शन के भीतर पहचानकर्ताओं के नाम हैं (प्रभावी रूप से स्थानीय चर नाम)।

"बाहरी नाम" अन्य पहचानकर्ताओं के नाम होंगे, जिनमें कार्यों के नाम और वैश्विक दायरे में घोषित किसी भी पहचानकर्ता या स्टोरेज क्लास एक्स्टर्न के साथ घोषित किया गया है।

असल में, जो कुछ भी "बाहरी रूप से दिखाई देने" की आवश्यकता है, केवल 6 (गैर केस संवेदनशील) अद्वितीय पात्रों की गारंटी है, जो बेहद सीमित है।

प्रैक्टिस में, यह अब कोई मुद्दा नहीं है। सी 99 ने इन सीमाओं में वृद्धि की, और अधिकांश आधुनिक कंपाइलर्स इन सीमाओं को दूर या महत्वपूर्ण रूप से बढ़ाते हैं। उदाहरण के लिए, सभी पहचानकर्ता में Visual C++ allows 247 characters for uniqueness (आंतरिक या बाह्य) जब सी

+0

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

25

मेरी सफेद दाढ़ी पथपाकर और एक संत और गर्वित आवाज में बोल संकलन, मैं कहता हूँ:

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

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

उदाहरण के लिए, कार्यों के नाम ... उदा। "मुख्य" और "sqrt" ... ऑब्जेक्ट मॉड्यूल में दिखने की आवश्यकता है, इसलिए अन्य ऑब्जेक्ट मॉड्यूल से कोड उनका उपयोग कर सकता है। तो "बाहरी" शैली के वैश्विक चर के नाम भी थे। वे बाहरी नाम हैं।

लेकिन सी प्रोग्राम में अन्य सभी नाम, उदाहरण के लिए कार्यों के दायरे में चर के नाम, structs के सदस्यों के नाम, और आगे, इसे ऑब्जेक्ट मॉड्यूल में बनाने की आवश्यकता नहीं थी। जिन्हें "आंतरिक नाम" कहा जाता है।

तो, उदाहरण के लिए, यदि आप इन सी चर एक समारोह

int myFavoriteItem; 
int myFavoriteThing; 

भीतर हो सकता था और वह ठीक हो जाएगा। लेकिन आप उन्हें बाहरी चर के रूप में घोषित कर सका, इसलिए जैसे:

extern int myFavoriteItem; 
extern int myFavoriteThing; 

कुछ प्रणालियों वस्तु फ़ाइलों के लिए बाहर इन नामों लिखते थे जैसे कि वे छह पत्र लंबे थे (क्योंकि वस्तु फ़ाइलों क्या से कोई लेना देना नहीं पता था लंबे नाम)। फिर वे ऑब्जेक्ट फ़ाइल को देखेंगे जैसे कि उन्हें इस तरह घोषित किया गया था।

extern int myFavo; 
extern int myFavo; 

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

आपके द्वारा उद्धृत मार्ग निर्दिष्ट करता है कि कंपाइलर्स को आंतरिक नाम के कम से कम 31 वर्ण और बाहरी नाम के 6 को पहचानना होगा। आधुनिक कंपाइलर्स और टूलचेन में अब अलग-अलग नाम-लंबाई सीमाएं नहीं हैं।

+7

+1 और वास्तव में एक सफेद दाढ़ी है! – Spevy

+3

+1: मुझे फोरट्रान से कोड के लिए कोड में कोडिंग याद है ... 6 वर्ण monocase।इसने सार्थक नामों को एक मुश्किल मुश्किल बना दिया (विशेष रूप से जब नामस्थान नियम थे, इसलिए सभी नाम 'जी' शुरू हो गए, और आंतरिक कार्यों को 'gk' शुरू करना पड़ा, और फिर अगले दो 'डिवाइस ड्राइवर' के लिए आरक्षित थे (इसलिए ' gk0p ',' gk1t ', आदि, एक सार्थक निमोनिक देने के लिए उपलब्ध दो अक्षरों या अंकों की भव्य कुल छोड़कर!) –

+0

अधिक इतिहास के लिए: [Radix-50] (http://en.wikipedia.org/wiki/ DEC_Radix-50) अपराधियों में से एक जैसा लगता है। यह भी समझा सकता है कि प्रतीक नामों में $ क्यों अनुमति है। –

0

बाहरी नाम बाहरी संबंध के साथ एक पहचानकर्ता है। बाहरी पहचान के लिए पहचानकर्ता के लिए यह या तो फ़ाइल स्कोप का एक गैर स्थैतिक होना चाहिए या विशेष रूप से घोषित "बाहरी" होना चाहिए। उदाहरण:

int global_variable; 

int main(void) 
{ 
    int local_variable; 
    extern int extern_variable; 
    return 0; 
} 

उपरोक्त उदाहरण में, पहचानकर्ता global_variable और extern_variable बाहरी नाम हैं। local_variable एक आंतरिक नाम है।

ध्यान दें कि व्यावहारिक रूप से महत्वपूर्ण वर्णों की मात्रा केवल 31 और 6 की तुलना में बड़ी है। उदाहरण के लिए माइक्रोसॉफ्ट के सी कंपाइलर आंतरिक रूप से बाहरी और बाहरी दोनों नामों के लिए 247 महत्वपूर्ण पात्रों का उपयोग करता है। जीसीसी आंतरिक नामों के सभी पात्रों को महत्वपूर्ण मानता है। बाहरी नामों के महत्वपूर्ण वर्ण लिंकर पर निर्भर करते हैं (और अधिकांश प्लेटफार्मों पर एक ही नियम आंतरिक नामों के साथ लागू होता है; सभी वर्ण महत्वपूर्ण हैं।)

एएनएसआई मानक केवल कार्यान्वयन के लिए महत्वपूर्ण वर्णों की न्यूनतम संख्या बताता है मानक अनुरूप।

+0

स्कोप अप्रासंगिक है। सी मानक चार स्कोप निर्दिष्ट करता है: फ़ंक्शन, फ़ाइल, ब्लॉक और फ़ंक्शन प्रोटोटाइप। इनमें से कोई भी नहीं ये वैश्विक हैं। प्रासंगिक अवधारणा जुड़ाव है, जो आंतरिक, बाहरी, या कोई भी हो सकता है। फ़ाइल और ब्लॉक स्कोप पर पहचानकर्ता बाहरी संबंध (या नहीं) हो सकते हैं। –

+0

@EricPostpischil विवरण दिया गया है [यहां] (http://msdn.microsoft.com/en-us/library/e7f8y25b (v = vs.80) .aspx) गलत? विशेष रूप से: "बाहरी पहचानकर्ता (वैश्विक दायरे में घोषित किए गए या भंडारण वर्ग बाहरी के साथ घोषित)"। –

+0

हां, वह पाठ गलत है। सी के लिए आधिकारिक संदर्भ आईएसओ/आईईसी सी मानक है, माइक्रोसॉफ्ट नहीं। जैसा कि मैंने देखा, कोई वैश्विक दायरा नहीं है। लेकिन 'स्थिर int x;' के साथ सबसे बड़े संभावित दायरे, फ़ाइल स्कोप पर घोषित एक पहचानकर्ता पर विचार करें। इस पहचानकर्ता के पास फ़ाइल दायरा है लेकिन आंतरिक संबंध है। ऐसा कोई गुंजाइश नहीं है जो बाह्य संबंध की गारंटी देता है। –

4

बाहरी नाम:

"बाह्य" नाम जो कि अन्य संकलन इकाइयों, गैर स्थिर कार्यों और चर "extern" कीवर्ड के साथ घोषित की तरह करने के लिए दिखाई दे रहे हैं कर रहे हैं। इन नामों को लिंकर्स और लोडर से अवगत कराया जाना है। ये ओल्डन डेज़ में, कुछ लिंकर्स और लोडर केवल बहुत छोटे नामों को संभाल सकते थे।

आंतरिक नाम: - मूल रूप से "स्थिर" गुंजाइश, या कुछ भी एक समारोह के लिए स्थानीय के साथ कुछ भी

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

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