जवाबों:
आप मूल रूप से C ++ 03 मानक से खंड §7.3.1.1 / 2 का उल्लेख कर रहे हैं,
स्थैतिक कीवर्ड का उपयोग वस्तुओं को किसी नेमस्पेस स्कोप में घोषित करते समय किया जाता है; अनाम-नेमस्पेस बेहतर विकल्प प्रदान करता है।
ध्यान दें कि यह पैराग्राफ पहले ही C ++ 11 में हटा दिया गया था। static
कार्य मानक के अनुसार नहीं रह गए हैं!
फिर भी, अनाम नाम स्थैतिक कीवर्ड से बेहतर हैं, मुख्य रूप से क्योंकि कीवर्ड static
केवल चर घोषणाओं और कार्यों पर लागू होता है , उपयोगकर्ता-परिभाषित प्रकारों के लिए नहीं ।
C ++ में निम्न कोड मान्य है
//legal code
static int sample_function() { /* function body */ }
static int sample_variable;
लेकिन यह कोड मान्य नहीं है:
//illegal code
static class sample_class { /* class body */ };
static struct sample_struct { /* struct body */ };
तो समाधान है, अनाम-नामस्थान, जो यह है,
//legal code
namespace
{
class sample_class { /* class body */ };
struct sample_struct { /* struct body */ };
}
आशा है कि यह बताता है कि क्यों unnamed-namespace
श्रेष्ठ है static
।
इसके अलावा, ध्यान दें कि किसी नेमस्पेस स्कोप (स्टैंडर्ड के अनुसार) में ऑब्जेक्ट्स की घोषणा करते समय स्टेटिक कीवर्ड का उपयोग किया जाता है।
deprecated
टिप्पणी नवीनतम सी ++ 0x एफसीडी (एन 323) से हटा दी गई थी।
.cpp
एक ही नाम के साथ एक वर्ग को परिभाषित कर रहा है।
इससे संबंधित एक दिलचस्प समस्या है:
मान लीजिए कि आप किसी फ़ंक्शन को मॉड्यूल (अनुवाद इकाई) में आंतरिक बनाने के लिए static
कीवर्ड या अनाम namespace
का उपयोग करते हैं , क्योंकि यह फ़ंक्शन मॉड्यूल द्वारा आंतरिक रूप से उपयोग करने के लिए है और इसके बाहर पहुंच योग्य नहीं है। ( namespace
डेटा और टाइप परिभाषाओं को आंतरिक बनाने का फायदा है, कार्यों के अलावा भी)।
समय के साथ आपके मॉड्यूल के कार्यान्वयन की स्रोत फ़ाइल बड़ी हो जाती है, और आप इसे कई अलग-अलग स्रोत फ़ाइलों में विभाजित करना चाहते हैं, जो कोड को बेहतर ढंग से व्यवस्थित करने, परिभाषाओं को त्वरित खोजने और स्वतंत्र रूप से संकलित करने की अनुमति देगा।
लेकिन अब आप एक समस्या का सामना करते हैं: वे कार्य अब static
मॉड्यूल के लिए नहीं हो सकते हैं , क्योंकि static
वास्तव में मॉड्यूल को संदर्भित नहीं करता है , लेकिन स्रोत फ़ाइल (अनुवाद इकाई) को। आपको उन्हें static
उस मॉड्यूल के अन्य भागों (ऑब्जेक्ट फ़ाइलों) से एक्सेस करने की अनुमति देने के लिए उन्हें गैर बनाने के लिए मजबूर किया जाता है । लेकिन इसका मतलब यह भी है कि वे अब मॉड्यूल के लिए छिपे हुए / निजी नहीं हैं: बाहरी लिंकेज होने पर, उन्हें अन्य मॉड्यूल से एक्सेस किया जा सकता है, जो कि आपका मूल उद्देश्य नहीं था ।
अनाम namespace
या तो इस समस्या का समाधान नहीं होता है, क्योंकि यह भी एक विशेष स्रोत फ़ाइल (अनुवाद इकाई) के लिए परिभाषित किया गया है और बाहर से पहुँचा नहीं जा सकता।
यह अगर एक निर्दिष्ट कर सकते हैं कि कुछ बहुत अच्छा होगा namespace
है private
कि है, जो कुछ भी उस में परिभाषित किया गया है,, मॉड्यूल यह के अंतर्गत आता है द्वारा आंतरिक रूप से इस्तेमाल किया जा करने के लिए है। लेकिन बेशक C ++ में "मॉड्यूल" के रूप में ऐसी अवधारणा नहीं है, केवल "अनुवाद इकाइयां" हैं, जो स्रोत फ़ाइलों के लिए कसकर बाध्य हैं।
C ++ मानक खंड .1.३.१.१ में पढ़ता है नामस्थान, पैरा २:
स्थैतिक कीवर्ड का उपयोग तब किया जाता है जब किसी नेमस्पेस स्कोप में वस्तुओं की घोषणा की जाती है, अनाम-नेमस्पेस एक बेहतर विकल्प प्रदान करता है।
स्टेटिक केवल ऑब्जेक्ट्स, फ़ंक्शंस और अनाम यूनियनों के नामों पर लागू होता है, न कि घोषणाओं को टाइप करने के लिए।
static
काम करता है।