2016-04-27 34 views
5

मुझे विरासत कोड का एक भयानक बिट विरासत मिला है जिसमें उपयोगिता वर्ग परिभाषा के लगभग 1000 लाइनें शामिल हैं जिन्हें स्रोत फ़ाइल में "असली" कोड से पहले प्रकट होने की आवश्यकता है। वह भी विरासत वर्गों जुड़े हो सकता है अन्य मॉड्यूल के साथ संघर्ष से बचने के लिए, मैं एक अनाम नेम स्पेस में उपयोगिता वर्ग डाल दिया है:क्या प्रति संकलन इकाई केवल एक अनाम नामस्थान है?

namespace { 
    class OldUtils { 
     OldUtils(); 
     int foo(); 
     double bar(); 
    }; 

    OldUtils::OldUtils() { 
     // hundreds of lines 
    } 

    int OldUtils::foo() { 
     // hundreds more lines 
    } 

    ... 
} 

class ActuallyInteresting { 
    // uses OldUtils 
}; 

लेकिन मैं ActuallyInteresting कोड है कि लोगों को (वास्तव में) में रुचि होगी किया जाना पसंद करेंगे फ़ाइल के शीर्ष के पास, उदाहरण के लिए दाएं तरफ से दाएं 50 से शुरू, उदा। लाइन 1000 से शुरू करना। एक भयानक उपयोगिता वर्ग को एक अलग संकलन इकाई में विभाजित करना एक विकल्प नहीं है, उच्च स्तरीय कारणों के लिए मैं अंदर नहीं जाऊंगा!

तो मैं सोच रहा हूं कि शॉर्ट क्लास घोषणा को रखना संभव है - विधि परिभाषाओं के बिना - फ़ाइल के शीर्ष पर एक अनाम नामस्थान में, और नीचे किसी अन्य अनाम नाम में अधिक विधि परिभाषाएं:

namespace { 
    class OldUtils { 
     OldUtils(); 
     int foo(); 
     double bar(); 
    }; 
} 

class ActuallyInteresting { 
    // uses OldUtils 
}; 

namespace { 
    OldUtils::OldUtils() { 
     // hundreds of lines 
    } 

    int OldUtils::foo() { 
     // hundreds more lines 
    } 

    ... 
} 

इन दो "अलग" अनाम नामस्थान संकलन इकाई के भीतर एक ही दायरे रूप में माना जाएगा, या विभिन्न अद्वितीय नामस्थान प्रत्येक के लिए उत्पन्न हो जाएगा? क्या मानक के बारे में कुछ कहना है?

+0

प्रत्येक अनाम नाम स्थान प्रत्येक अनुवाद इकाई के लिए अद्वितीय हो जाएगा (एक अनुवाद इकाई में स्थिर के रूप में ही) –

+0

@ DieterLücking: अगर यह सच है, कैसे एक पहुँच एक और अनुवाद इकाई में एक अनाम नाम स्थान में एक वैश्विक चर करता है? क्या अन्य अनुवाद इकाई का नाम स्कोप रिज़ॉल्यूशन टेक्स्ट में जोड़ा जाता है? –

उत्तर

4

इन दो "अलग" अनाम नामस्थान संकलन इकाई के भीतर ही गुंजाइश रूप में माना जाएगा, या विभिन्न अद्वितीय नामस्थान प्रत्येक के लिए उत्पन्न किया जा होगा? क्या मानक के पास के बारे में कुछ कहना है?

हां, उन्हें संकलन इकाई के समान माना जाएगा। और मानक कुछ कहना है ....

latest standard draft का हवाला देते हुए ... (जोर मेरे हैं)

$7.3.1.1 एक अनाम-नाम स्थान परिभाषा बर्ताव करता है जैसे कि वह

द्वारा प्रतिस्थापित किया गया
inlineopt namespace unique { /* empty body */ } 
using namespace unique ; 
namespace unique { namespace-body } 

जहां inline प्रकट होता है तभी यह अनाम-नाम स्थान परिभाषा में प्रकट होता है और की सभी घटनाओं अगर uniqueएक अनुवाद इकाई में एक ही पहचानकर्ता ने ले ली है, और इस पहचानकर्ता अनुवाद इकाई में अन्य सभी पहचानकर्ता

इस छोटे से कार्यक्रम संकलित से अलग है, अपने संकलक चर पुन: घोषणा की शिकायत करनी चाहिए ...

namespace { int c = 0; } 
namespace { double c = 8; } 

int main(){ ++c; } 

हालांकि, एक अनाम नामस्थान में चर का उपयोग करने के लिए, आप वैश्विक चरों तक पहुंचने के नियमित तरीके का उपयोग करते हैं ...इसलिए यह काम करेगा।

namespace { int c = 0; } 
namespace { void f(){ c = 8; } } 

int main(){ ++c; } 
-2

यदि निम्नलिखित कोड को संकलित करता है बस की जाँच करके जवाब अपने आप को यह पता लगाने कर सकते हैं:

namespace { 
    int a; 
} 

namespace { 
    int *b=&a; 
} 

आप यदि प्रत्येक नाम स्थान अद्वितीय है एक संकलन त्रुटि प्राप्त करने की उम्मीद; और यदि दोनों नामों में अनाम नामस्थान समान है, तो यह किसी भी मुद्दे के साथ संकलित नहीं होगा।

+0

यह कहना चाहिए था कि मैंने इस नस में एक बुनियादी परीक्षण किया है (यह और यह काम करने लगता है)। लेकिन क्या यह मानक, या एक संकलक-निर्भर अपरिभाषित व्यवहार की बात से गारंटी है? धन्यवाद – andybuckley

+2

बस एक कंपाइलर का उपयोग कोड मानक नहीं बनाता है। एमएसवीएस खुशी से 'int और var = some_function_that _retunrs_int()' संकलित करेगा जो गैर मानक है। – NathanOliver

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