2012-07-02 28 views
6

मैं हाल ही में Stroustrups सी ++ प्रोग्रामिंग भाषा और लिंकेज के बारे में धारा 9 अध्याय में मैं निम्नलिखित पैराग्राफ में आए में पढ़ रहा था:हमें कक्षा या फ़ंक्शन (सी ++) के अंदर केवल 'स्थिर' का उपयोग क्यों करना चाहिए?

"सी और पुराने सी ++ कार्यक्रमों में, कीवर्ड स्थिर है (भ्रमित करने वाले) का उपयोग "आंतरिक संबंध का उपयोग" करने के लिए किया गया है। और कक्षाओं के अंदर कार्य को छोड़कर स्थिर का उपयोग न करें। "

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

+2

करीबी वोट के मालिक के लिए: यह रचनात्मक नहीं है? –

+0

शायद यह कुछ मदद है http://stackoverflow.com/questions/1358400/what-is-external-linkage-and-internal-linkage-in-c –

उत्तर

5

मुझे लगता है कि विचार आंतरिक लिंकेज पर भ्रूभंग करने के लिए, लेकिन static के नए अर्थ के साथ भ्रम से बचने के नहीं है: static रास्ता भी कई अर्थ है (आंतरिक लिंकेज के साथ सामान की घोषणा, स्थैतिक भंडारण अवधि के साथ स्थानीय चर को परिभाषित करने, अंकन कक्षाओं के गैर-उदाहरण सदस्य), इसलिए कम अंतर्ज्ञानी लोगों में से एक से बचना एक अच्छी बात है।

इस वजह से, सी ++ 98 मानक आंतरिक लिंकेज के साथ सामान घोषित करने का एक और तरीका प्रदान करता है: unnamed namespaces, और static "नामस्थान स्कोप में ऑब्जेक्ट घोषित करते समय" को हटा देता है।

सी ++ 11 मानक ने इस बहिष्कार को हटा दिया (और किसी भी तरह से नामित नामस्थानों का अर्थात् बदल दिया, वास्तव में आंतरिक संबंध की आवश्यकता नहीं है), तो अब यह वास्तव में शैली का मामला है।

+3

अनाम नामस्थान _not_ अपनी सामग्री को आंतरिक संबंध बनाते हैं। वे इसे एक नामस्थान में रखते हैं जिसे अनुवाद इकाई के बाहर नामित नहीं किया जा सकता है, लेकिन जुड़ाव अभी भी बाहरी है, जो टेम्पलेट्स के लिए एक अंतर बनाता है। –

+0

@JamesKanze: क्या यह अभी भी टेम्पलेट्स के लिए एक अंतर बनाता है, या आप 2011 की पूर्व भाषा का जिक्र कर रहे हैं? –

+0

@ जेम्ससांज: यह टेम्पलेट्स के लिए क्या अंतर बनाता है? –

4

क्योंकि सी ++ में अज्ञात नामस्थानों को प्राथमिकता दी जानी चाहिए, जो मूल रूप से समान कार्यक्षमता प्रदान करते हैं।

मैं इस संदर्भ में static लगता है क्योंकि डबल अर्थ पर सिकोड़ी है, और तथ्य यह है कि दो अर्थ काफी विपरीत हैं - अगर अंदर एक class या एक struct यह एक वैश्विक राज्य का प्रतिनिधित्व करता है, जबकि बाहर यह आंतरिक Linkeage देता है और प्रत्येक अनुवाद इकाई के लिए एक चर या विधि की एक प्रति प्रदान करता है।

मोरेसो, static केवल फ़ंक्शंस और चर पर लागू हो सकता है, जबकि अज्ञात नेमस्पेस के अंदर आप प्रकार की घोषणाएं कर सकते हैं।

namespace //OK 
{ 
    class X {}; 
} 

static class X //syntactically correct, but does nothing 
{ 
}; 

ध्यान दें कि मानक static के उपयोग के रूप पदावनत Linkeage निर्दिष्ट करने के लिए समझे।

+0

यह भी तथ्य है कि आप 'स्थिर' ऑब्जेक्ट्स या फ़ंक्शंस का उपयोग नहीं कर सकते एक टेम्पलेट को चालू करने के लिए। (और कुछ हद तक विरोधाभासी तथ्य है कि नेमस्पेस स्कोप पर 'कॉन्स्ट' चर वैरिएबल' डिफ़ॉल्ट रूप से 'स्थिर' है।) –

+1

सी ++ 11 ने बहिष्करण को हटा दिया, और टेम्पलेट तर्कों पर मूर्खतापूर्ण प्रतिबंध भी हटा दिया। एक दूसरे को पसंद करने के लिए अब कोई विशेष कारण नहीं है। –