2012-04-30 9 views
10

Possible Duplicate:
Creating C macro with ## and LINE (token concatenation with positioning macro)अलग चर नाम

के लिए __LINE__ का उपयोग कर मैक्रो बनाना मैं उपयोग करने के लिए __LINE__ मैक्रो विभिन्न चर नाम उत्पन्न करने के लिए कोशिश कर रहा हूँ। मेरे पास बेंचमार्क नामक एक स्कोप्ड बेंचमार्क क्लास है (यूटिल नेमस्पेस में स्थित है) और यह कन्स्ट्रक्टर स्ट्रिंग लेता है।

#define BENCHMARK_SCOPE utils::Benchmark bm##__LINE__(std::string(__FUNCTION__)) 

दुर्भाग्य से यह निम्न त्रुटि का कारण बनता है:

<some_file_name>(59): error C2374: 'bm__LINE__' : redefinition; multiple initialization

यह मैं इस निष्कर्ष __LINE__ मैक्रो का विस्तार नहीं हो की ओर जाता है यहाँ मैक्रो परिभाषा मैं बनाया है है। मैंने this post के अनुसार अपना मैक्रॉस बनाया है। क्या आपके पास विचार हैं कि __LINE__ क्यों विस्तारित नहीं होता है?

EDIT: शायद संकलक जानकारी भी रिलीज़ होती है। मैं दृश्य स्टूडियो 2010

+0

हम्म। क्या आपने 'बीएम ## __LINE__' (एक स्पेस के साथ) की कोशिश की है? – Cameron

+0

@ कैमरॉन मैंने आपकी टिप्पणी का धन्यवाद किया लेकिन कुछ भी नहीं बदला है। –

+0

ठीक है, कोशिश करने के लिए एक और हैक: '# परिभाषित करें _BENCHMARK_SCOPE (लाइन) utils :: बेंचमार्क बीएम ## लाइन (...' '# परिभाषित करें BENCHMARK_SCOPE _BENCHMARK_SCOPE (__ LINE __)' – Cameron

उत्तर

13

आप 2 मैक्रो के संयोजन का उपयोग करने की जरूरत है। यह से पहले रिकर्सिव मैक्रो विस्तार (ताकि आप मैक्रो का नाम प्राप्त करने के लिए टोकन पेस्ट कर सकें आग्रह करना चाहते हैं)। इस प्रकार:

#define PASTE(a,b) a ## b 

PASTE के लिए पारित सटीक तर्क पेस्ट करेंगे, तब जिसके परिणामस्वरूप नए टोकन का विस्तार करने का प्रयास करें।

#define PASTE_HELPER(a,b) a ## b 
#define PASTE(a,b) PASTE_HELPER(a,b) 

यहाँ, PASTE को तर्क से पहले PASTE_HELPER लागू है विस्तार किया जाएगा: प्रभाव आप चाहते हैं पाने के लिए आपको अविवेक की एक अतिरिक्त स्तर की जरूरत है।

+0

क्या आपको पता है कि मुझे इसके लिए दो मैक्रोज़ का उपयोग करने की आवश्यकता क्यों है? –

+1

@izomorphius, असल में आपका प्रश्न किसी दूसरे का डुप्लिकेट है, जहां इसे अच्छी तरह से समझाया गया है। मैंने आपके प्रश्न पर टिप्पणी की है, कृपया इसे जांचें। – iammilind

5

उपयोग कर रहा हूँ इस कोड की कोशिश, मैं एक पुराने परियोजना में इसका इस्तेमाल किया गया है

#define CONCATENATE_DIRECT(s1, s2) s1##s2 
#define CONCATENATE(s1, s2) CONCATENATE_DIRECT(s1, s2) 
#ifdef _MSC_VER // Necessary for edit & continue in MS Visual C++. 
# define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __COUNTER__) 
#else 
# define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __LINE__) 
#endif 


int ANONYMOUS_VARIABLE(var) 

संपादित करें:

मुझे लगता है कि आप केवल तब दृश्य स्टूडियो में काउंटर का उपयोग करना चाहिए precompiled हेडर का भी उपयोग कर रहे हैं।

COMBINE(x,__LINE__); 
+0

यह __LINE__ के साथ भी काम करता है। –

3

आप टोकन चिपकाने का उपयोग कर रहे

#define COMBINE1(X,Y) X##Y // helper macro 
#define COMBINE(X,Y) COMBINE1(X,Y) 

और फिर के रूप में उपयोग:

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