tutorial - the c++ programming language




कक्षाओं के बाहर स्थैतिक कार्य (4)

एक static फ़ंक्शन केवल फ़ाइल स्कोप में दिखाई देता है। यह एक C फीचर है।
C ++ में इसे करने का अनुशंसित तरीका अनाम नाम स्थान का उपयोग कर रहा है, जैसे:

namespace // no name, i.e. anonymous
{
   static void someRandomFunction(); 
}

int main()
{
    someRandomFunction(); // visible only within this file.
    return 0;
}

ध्यान दें कि फ़ंक्शन बॉडी को भी उसी फ़ाइल के भीतर कहीं घोषित किया जाना है क्योंकि लिंकर इसे अन्य (बाहरी) अनुवाद इकाइयों में खोजने की कोशिश नहीं करेगा।
तो static void someRandomFunction(); वास्तव में एक फ़ंक्शन के लिए आगे की घोषणा है जिसे उसी फ़ाइल में कहीं और परिभाषित किया गया है (यानी उसी अनुवाद इकाई में)।

यदि फ़ंक्शन वास्तव में कहा जाता है, तो आपको लिंकिंग त्रुटि मिलेगी जब तक कि फ़ंक्शन बॉडी को उसी फ़ाइल में परिभाषित नहीं किया गया हो।

क्या कोई मुझे बता सकता है कि कक्षाओं के बाहर स्थिर कार्यों की घोषणा करने का उद्देश्य क्या है? इस 2 में क्या अंतर है? क्या इस स्थिति में स्थैतिक का उपयोग करने के लिए कोई लाभ हैं?

static void someRandomFunction();

int main()
{
    someRandomFunction();
    return 0;
}

तथा

void someRandomFunction();

int main()
{
    someRandomFunction();
    return 0;
}

नाम स्थान के दायरे में, static एक नाम आंतरिक जुड़ाव देता है, जिसका अर्थ है कि यह केवल अनुवाद इकाई के भीतर उपलब्ध है जिसमें परिभाषा है। static बिना, इसमें बाहरी लिंकेज है , और किसी भी अनुवाद इकाई में सुलभ है।

तो आप static उपयोग करेंगे (या, वैकल्पिक रूप से, एक अनाम नामस्थान) जब कोई फ़ंक्शन लिख रहा हो जो केवल इस इकाई के भीतर उपयोग के लिए हो; आंतरिक लिंकेज का मतलब है कि अन्य इकाइयां विभिन्न नामों को एक ही नाम के साथ परिभाषित कर सकती हैं बिना नामकरण संघर्ष।

गैर-स्थिर कार्य (और सामान्य रूप से वैश्विक नाम) को हेडर में बेहतर घोषित किया जाता है, यह सुनिश्चित करने के लिए कि उनका उपयोग करने वाली प्रत्येक अनुवाद इकाई को समान घोषणा मिलती है।


स्थैतिक तरीके और स्थिर कार्य पूरी तरह से अलग चीजें हैं।

स्टेटिक तरीके एक उदाहरण के बजाय एक कक्षा के तरीके हैं (जो आप पहले से ही जानते हैं, जैसा कि ऐसा लगता है)।

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


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





c++