2012-02-06 17 views
5

मैंने बाहरी * .cpp फ़ाइल में कुछ फ़ंक्शन (यहां शामिल कोई कक्षाएं) परिभाषित नहीं की है, और निश्चित रूप से उपयुक्त * .h फ़ाइल है।जोर से मैं कार्यान्वयन फ़ाइलों में अनाम नामों का उपयोग करता हूं?

* .cpp फ़ाइल में कुछ फ़ंक्शंस का उपयोग केवल उस * .cpp फ़ाइल में कहीं और नहीं किया जाता है। उन्हें * .h फ़ाइल में भी उल्लेख नहीं किया गया है।

क्या मुझे उन कार्यों को एक अनाम नामस्थान में रखना चाहिए या वे अन्य कार्यों के बगल में रह सकते हैं? और यदि हां, तो मुझे उनके लिए एक अनाम नामस्थान क्यों चाहिए? मुझे कोई समस्या नहीं दिखाई दे रही है, क्योंकि वे कार्य किसी भी तरह से बाहर से उपलब्ध नहीं हैं।

+0

क्यों न केवल उन्हें 'स्थिर' बनाते हैं? (एक स्थिर सी फ़ंक्शन में, स्थिर वर्ग विधि नहीं) –

+1

@JamesMcLaughlin: उस उद्देश्य के लिए सी ++ 03 'स्थिर' में अच्छी तरह से बहिष्कृत किया गया था। हालांकि, सी ++ 11 इसे अनदेखा करता है। लेकिन 'स्थिर' और अनाम नामस्थान में होने का मतलब अलग-अलग चीजें हैं। 'स्थैतिक 'इसे आंतरिक जुड़ाव देगा, इसलिए फ़ंक्शन का उपयोग कुछ उद्देश्यों के लिए नहीं किया जा सकता है। –

+0

आपके सुझावों के लिए धन्यवाद। क्या इनमें से कोई भी समाधान, स्थैतिक या अप्रयुक्त नामस्थान, अनुशंसित या पसंदीदा है? – user1192880

उत्तर

9

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

निम्न उदाहरण लें:

// library.cpp 

// a "private" function here, in that it is not declared anywhere 
void f() {} 

namespace 
{ 
    // same as above, except within an anonymous namespace 
    void g() {} 
} 

// client.cpp 

void f(); 

int main() 
{ 
    // Can call f(), it's been declared and is now effectively "public" 
    f(); 

    // compilation error, this has no idea what g() is, it's not declared 
    // in any scope that can be resolved here 
    g(); 

    return 0; 
} 
+0

धन्यवाद! मुझे उस "फीचर" से अवगत नहीं था। – user1192880

+0

यह 'स्थिर' के लिए है। बेनामी नेमस्पेस इस सुविधा को कक्षाओं और structs के लिए प्रदान करते हैं। –

+0

क्या 'स्थिर 'कीवर्ड कोड के अन्य हिस्सों में मौजूद अन्य कार्यों के साथ नाम टकराव के खिलाफ भी सुरक्षा करता है? अनाम नामस्थान होगा। – Chad

1

मुझे लगता है कि आप इन कार्यों को बाहर से देखने की बात नहीं करना चाहते हैं static के रूप में उन्हें घोषणा करते हैं।

+0

* "... बाहर से देखा ..." * - क्या बाहर से? हेडर? अनुवाद इकाई? – jww

4

आपका प्रश्न दो में विभाजित किया जा सकता है:

1. "मैं वैश्विक कार्यों कैसे छिपा कर सकते हैं"

है कि, नहीं हेडर फाइल में समारोह के शीर्षक डाल करने के लिए क्या करने के लिए एक आसान तरीका:

//============================ 
// Filename: "mylibrary.hpp" 
//============================ 
// Description: 
// Utility functions. 
//============================ 
#ifndef MYLIBRARY_H_INCLUDED 
#define MYLIBRARY_H_INCLUDED 
//============================ 

namespace MyLibrary 
{ 
    void DoSomething(); 
} // namespace MyLibrary 

//============================ 
#endif // MYLIBRARY_H_INCLUDED 
//============================ 

पूर्ण कोड फ़ाइल:

//============================ 
// Filename: "mylibrary.cpp" 
//============================ 
// Description: 
// Utility functions. 
//============================ 
// self header include 
#include "mylibrary.hpp" 
//============================ 

namespace MyLibrary 
{ 
    void DoSomethingBefore() 
    { 
     // ... 
    } 

    void DoSomethingAfter() 
    { 
     // ... 
    } 

    void DoSomethingConfirmed() 
    { 
     // ... 
    } 

    void DoSomething() 
    { 
     DoSomethingBefore(); 
     DoSomethingConfirmed(); 
     DoSomethingAfter(); 
    } 
} // namespace MyLibrary 

//============================ 
#endif // MYLIBRARY_H_INCLUDED 
//============================ 

जब यह संकलित किया गया है , आपको "mylibrary.o" या "mylibrary.obj" फ़ाइल मिलती है। आप इसे अन्य डेवलपर्स के रूप में प्रदान कर सकते हैं: "mylibrary.hpp" प्लस "mylibrary.obj", लेकिन, "mylibrary.cpp" फ़ाइल के बिना। अधिकांश "सादा सी"/"सी ++" कंपाइलर्स इस तरह से काम कर सकते हैं।

अन्य तरीके हैं, अगले खंड को पढ़ें।

2. "अज्ञात नामस्थान, वैश्विक कार्यों को छिपाने के लिए एक अच्छी तकनीक है?"

"बेनामी नेमस्पेस" तकनीक, वैश्विक कार्यों को छिपाने का एक और तरीका है।

Unnamed/anonymous namespaces vs. static functions

लेकिन, व्यक्तिगत रूप से, मैं इस तकनीक की सलाह नहीं देते, "पसंदीदा" जवाब के रूप में:

पर एक समान सवाल ही नहीं है।

नेमस्पेस उन चीजों में से एक हैं, जिन्हें मैं "शुद्ध सी" या "सी ++" की शुरुआत के बाद से अस्तित्व में रखना चाहता हूं। लेकिन, "अनाम नामस्थान" या "अनाम नामस्थान", उपयोग करने के लिए अजीब लगता है।

ऐसा कुछ छिपाने की कोशिश करना पसंद है, और बाद में, भूल जाओ, आप इसे कहां स्टोर करते हैं।

3 अतिरिक्त सुझाव

(क) मैं एक ही मुख्य आवश्यक, वैकल्पिक नहीं, गैर-अनाम फ़ाइल प्रति नाम स्थान का उपयोग करने के सुझाव देते हैं। इसमें घोंसला, अतिरिक्त आंतरिक नामस्थान हो सकते हैं। प्रत्येक मुख्य नामस्थान, एक ही आईडी होना चाहिए। फ़ाइल नाम के रूप में, लेकिन, फ़ाइल एक्सटेंशन या फ़ाइल प्रत्यय के बिना।

(बी) अनाम नामस्थान से बचें। यह एक सूचकांक के बिना, एक गोदाम में चीजें भंडार की तरह है।

(सी) अपने हेडर फ़ाइलों में फ़ाइल एक्सटेंशन, या फ़ाइल उपसर्ग का उपयोग करें, शायद ".h", या ".hpp", भले ही यह एक सी ++ फ़ाइल हो। मानक कहता है कि C++ को "C++" फ़ाइलों पर फ़ाइल एक्सटेंशन या फ़ाइल प्रत्यय का उपयोग नहीं करना चाहिए, लेकिन फाइल सिस्टम को पहचानना या ढूंढना मुश्किल है।

गुड लक।