2009-12-18 17 views
5

के साथ कॉन्सैट मैक्रो तर्क मेरे पास एक मैक्रो है, जहां तर्कों में से एक एक enum मान है, जो नामस्थान स्कोप निर्दिष्ट किए बिना दिया जाता है। हालांकि मैक्रो के अंदर कहीं मुझे इसे एक्सेस करने की ज़रूरत है (जाहिर है मुझे वहां नामस्थान को परिभाषित करना होगा), लेकिन मैं टेम्पलेट पैरामीटर के साथ नेमस्पेस नाम को सम्मिलित नहीं कर सकता। निम्नलिखित नमूना कोड को देखते हुए संकलक शिकायत करता है कि pasting :: and Val doesnt give a valid preprocessor token (हालांकि यह प्राप्त करने के लिए ठीक काम करता है और प्राप्त करने के लिए ठीक है)।नामस्थान

namespace TN 
{ 
    enum Info 
    { 
     Val = 0 
    }; 
} 

#define TEST(a) TN::Info get ## a(){return TN::##a;} 
TEST(Val) 

तो वहाँ एक और तर्क का उपयोग और मूल रूप से निर्दिष्ट करने दो बार (जैसे #define TEST(a,b) TN::Info get ## a(){return b;}) प्रयोग की जाने वाली मूल्य के बिना इस काम करने के लिए किसी भी तरह से है?

उत्तर

10

## एक टोकन चिपकाने ऑपरेटर है, यानी यह टोकन के कई टुकड़े से बाहर एक भी टोकन बनाना चाहिए और के रूप में संकलक कहते हैं, ::Val एक भी टोकन, यह दो टोकन है।

आपको क्यों लगता है कि आपको दूसरे ## की आवश्यकता क्यों है? इसके साथ क्या गलत है।

#define TEST(a) TN::Info get ## a() { return TN::a; } 
+0

स्पष्ट रूप से मैं जटिल होने का तरीका सोच रहा हूं, धन्यवाद – Grizzly

+0

@ ग्रीज़ली: विडंबना यह है कि विपरीत! मेरा पहला वृत्ति भी संयोजित करने के लिए है, क्योंकि मैक्रोज़ मूल रूप से टेक्स्ट प्रतिस्थापन को ढूंढते हैं और प्रतिस्थापित करते हैं। यह तब होता है जब आप महसूस करते हैं कि वे _are_ इससे अधिक जटिल हैं (उसमें वे _tokens_ पर काम करते हैं और हमारे दिमाग नहीं करते हैं) इस तरह के मुद्दे आते हैं। :) –

3

केवल 2# का उपयोग करें जब आप दो आइटमों को जोड़ना चाहते हैं और संकलक को एक टोकन (उदाहरण के लिए एक पहचानकर्ता) के रूप में परिणाम का इलाज करना है।

अपने मैक्रो में, ## का इस्तेमाल पहली बार सही है, के रूप में आप और, जैसा कि आप सिर्फ बनाना चाहते एक साथ चिपकाने get द्वारा एक पहचानकर्ता के निर्माण के लिए कोशिश कर रहे हैं a की सामग्री है, लेकिन ## के दूसरे उपयोग नकली है a की सामग्री से पहचानकर्ता और :: ऑपरेटर उस के लिए एक अलग इकाई है। जीसीसी इस बारे में शिकायत करेगा (हालांकि एमएसवीसी ++ पुलिस)।

#define TEST(a) TN::Info get ## a(){return TN::a;} 

काम करना चाहिए।

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