2009-07-06 19 views
42

अगर मैं इस तरह के रूप में एक नाम स्थान के भीतर एक #define बयान है:#define बयान

namespace MyNamespace 
{ 
    #define SOME_VALUE 0xDEADBABE 
} 

हूँ मैं कह रही है कि #define बयान नाम स्थान तक सीमित नहीं है में सही हूँ?

निम्नलिखित "सही" चीज़ निम्नलिखित है?

namespace MyNamespace 
{ 
    const unsigned int SOME_VALUE = 0xDEADBABE; 
} 
+3

दोनों मामलों में सही। –

उत्तर

54

सही, #define नामस्थानों से बंधे नहीं हैं। #define एक preprocessor निर्देश है - यह संकलक के माध्यम से संकलित होने से पहले स्रोत फ़ाइल में हेरफेर में परिणाम देता है। संकलन चरण के दौरान नेमस्पेस का उपयोग किया जाता है और संकलक के पास #define की अंतर्दृष्टि नहीं है।

आपको जितना संभव हो सके प्रीप्रोसेसर से बचने की कोशिश करनी चाहिए। इस तरह के निरंतर मूल्यों के लिए, #define से अधिक कॉन्स पसंद करते हैं।

+1

+1 - आपका अंतिम विवरण मुझे प्रभावी सी ++ –

+1

constexpr की याद दिलाता है # परिभाषा के कॉन्स्टेंट मूल्य अभिव्यक्ति के बराबर उपयुक्त है – jaskmar

3

हां। सामान्य रूप से, # परिभाषित मानों के बजाय कॉन्स्ट मानों का उपयोग करने से कई फायदे होते हैं। चर के दायरे को सीमित करना फायदे में से एक है। दायरे को किसी नामस्थान तक सीमित किया जा सकता है, या इस तरह के किसी अन्य वैध दायरे में (कक्षा स्तर, कार्य स्तर, आदि सहित)।

4

पूर्वप्रक्रमक संचालित (धारणात्मक कम से कम, और अक्सर वास्तव में भी) नामस्थान और अन्य भाषा-स्तरीय अवधारणाओं "में किक" से पहले - तो हाँ, यह निश्चित रूप से बहुत बेहतर जैसे भाषा-स्तरीय निर्माणों का उपयोग करने के const मूल्य जहां भी आप कर सकते हैं!

0

यदि किसी कारण से, आप दूसरे मामले में नहीं बदल सकते हैं, तो मुझे पूरा यकीन है कि आपको MyNamespace को अपनी ऑब्जेक्ट में संकलित करने और ऑब्जेक्ट को अलग से लिंक करने की देखभाल करना होगा (या संभवतः केवल प्रीप्रोसेसर चलाएं खुद ही उस नामस्थान पर)। सी ++ प्रीप्रोसेसर को #define कथन लेना चाहिए और अनिवार्य रूप से को कहीं भी प्रतिस्थापित करना चाहिए जो SOME_VALUE स्रोत कोड में देखा जाता है। इसलिए यदि प्रीप्रोसेसर #define, SOME_VALUE से अवगत नहीं है, तो किसी अन्य स्रोत फ़ाइल में प्रतिस्थापित नहीं किया जा सकता है।

18

मैं स्थिरांक के उपयोग पर सुझावों और #define एस के लिए असीमित होने के सुझावों से पूरी तरह से सहमत हूं।

हालांकि, अगर आप पूर्वप्रक्रमक #define लाइनों का उपयोग करने की क्या ज़रूरत है , उन्हें सही ढंग से की उम्मीद क्षेत्र के लिए, कवर कृपया ऊपर

namespace MyNamespace 
{ 
    #define SOME_VALUE 0xDEADBABE 
    // your code 
    #undef SOME_VALUE 
} 

क्यों #defines?
मुझे एक ऐसे मामले को पता है जहां एक एम्बेडेड प्लेटफ़ॉर्म कोड में स्थिरांक का समर्थन नहीं करता था।
उन्हें प्रारंभ करने का कोई तरीका नहीं था ...
यह हमेशा अधिक पठनीय होने में मदद करता है।