2013-02-21 17 views
8

मैं नामस्थान में मैक्रो का उपयोग कर के साथ एक समस्या मिल गया है। कोडसी ++ मैक्रो और नामस्थान

#include <iostream> 

namespace a 
{ 
#define MESSAGE_A(message) \ 
    std::cout << (message) << std::endl; 
} 

#define MESSAGE_A(message) \ 
    std::cout << (message) << std::endl; 

int main() 
{ 
    //works fine 
    MESSAGE_A("Test"); 
    //invalid 
    a::MESSAGE_A("Test") 
    return 0; 
} 

क्या मैक्रो में namespaced वस्तुओं का उपयोग करने का उचित संस्करण है।

उत्तर

11

मैक्रो पूर्व प्रोसेसर है, जो नामस्थान के बारे में कुछ नहीं जानता द्वारा नियंत्रित किया जाता है। तो मैक्रोज़ नामित नहीं हैं, वे केवल टेक्स्ट प्रतिस्थापन हैं। मैक्रोज़ का उपयोग वास्तव में अन्य कारणों से निराश होता है क्योंकि वे हमेशा वैश्विक नामस्थान को प्रदूषित करते हैं।

यदि आपको एक संदेश मुद्रित करने की आवश्यकता है, और आपको इसे नामित करने की आवश्यकता है, तो बस एक इनलाइन फ़ंक्शन का उपयोग करें। कोड ठीक से रेखांकित होने के लिए पर्याप्त सरल लगता है:

namespace a 
{ 
    inline void MESSAGE_A(const char* message) 
    { 
    std::cout << message << std::endl; 
    } 
} 
2

यह काम नहीं करेगा। मैक्रोज़ नामस्थानों के बारे में कुछ भी नहीं जानता है। यदि आप नेमस्पेस का उपयोग करना चाहते हैं - तो आपको मैक्रोज़ का उपयोग नहीं करना चाहिए।

+0

वर्कअराउंड समाधान में सहायता कर सकता है। मेरी परियोजना में मुझे नामस्थान में मैक्रोज़ का उपयोग करना होगा और उन्हें मैक्रोज़ को किसी अन्य नामस्थान से कॉल करना होगा। – shadeglare

+0

@ मैक्सएफएक्स, मैक्रोज़ को "बुलाया नहीं जाता", वे प्रतिस्थापित होते हैं। यदि आपको अत्यधिक जटिलता के लिए मैक्रोज़ का उपयोग करने की आवश्यकता है, तो आप कुछ गलत कर रहे हैं। – StoryTeller

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