2013-05-31 5 views
8

सी ++ में, मुझे पता है कि अगर मैं स्थिर के साथ एक समारोह की घोषणा, यह नाम केवल संकलन इकाई जहां यह घोषित किया जाता है/परिभाषित करने के लिए उपलब्ध नहीं होगा:अनाम नामस्थान के अंदर और बाहर स्थिर फ़ंक्शन को परिभाषित करने के बीच कोई भिन्नता है?

static void MyFunction() {...} 

इसके अलावा, अगर मैं एक गुमनाम नाम स्थान के अंदर अपने समारोह की घोषणा , इसका नाम केवल स्थानीय संकलन इकाई में मौजूद नहीं होगा:

namespace 
{ 
    void MyFunction() {...} 
} 

इसके अलावा, मैं गुमनाम नाम स्थान के अंदर स्थिर उपयोग कर सकते हैं:

namespace 
{ 
    static void MyFunction() {...} 
} 

क्या उन परिभाषाओं के बीच कोई अंतर है?

धन्यवाद

+2

http://stackoverflow.com/questions/154469/unnamed-anonymous-namespaces-vs-static-functions – catscradle

+0

@catscradle लगभग समान है, लेकिन अज्ञात के अंदर स्थिर उपयोग पर चर्चा न करें। – bcsanches

उत्तर

12

हां, एक अंतर है।

सबसे पहले, चतुर होने के बिंदु पर भी सटीक होना चाहिए: नाम हर जगह मौजूद हैं। अंतर यह है: एक प्रतीक (नाम स्थान दायरे में) static घोषित किया जाता है

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

  • एक अनाम नामस्थान नामस्थान उत्पन्न करता है जिसका नाम अनुवाद इकाई के लिए अद्वितीय है। प्रतीक में अभी भी बाहरी लिंकेज है (बशर्ते यह स्थैतिक नहीं है), लेकिन इसे किसी अन्य अनुवाद इकाई में नाम देने का कोई तरीका नहीं है।

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

+1

हां, सी ++ 11 ने टेम्पलेट्स के लिए बाहरी लिंकेज की आवश्यकता के बारे में आवश्यकता को मिटा दिया। जो सहायक है, क्योंकि मुझे लगता है कि लैम्ब्डा अभिव्यक्ति के प्रकार में कोई संबंध नहीं है। – aschepler

+0

@aschepler यह लैम्ब्डा के बिना भी सहायक है, लेकिन निश्चित रूप से, लैम्ब्डा संभावनाओं का एक नया नया विस्टा खोलता है। –

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