2010-11-26 13 views
13

प्रीप्रोसेसर काम करता है कि मेरा मानसिक मॉडल स्पष्ट रूप से अपूर्ण है, और यह मुझे पागल कर रहा है।प्रीप्रोसेसर टोकन विस्तार

मैं दो टोकन को जोड़ना चाहता हूं, लेकिन दूसरा टोकन पहले विस्तारित किया जाना चाहिए।

#define ANSWER 42 

#define FOO foo_ ## ANSWER 

यहाँ, FOOfoo_ANSWER के लिए विस्तारित, लेकिन मैं इसे foo_42 होना चाहता हूँ। इसलिए मैं उम्मीद है कि इस किसी भी तरह संयोजन से पहले बहस का विस्तार होगा में एक MERGE मैक्रो निर्धारित:

#define MERGE(x, y) x ## y 

#define BAR MERGE(bar_, ANSWER) 

लेकिन BAR अभी भी bar_ANSWER बजाय bar_42 विस्तारित होती है। तो मैं एक और मैक्रो HELPER को परिभाषित:

#define HELPER(x, y) MERGE(x, y) 

#define BAZ HELPER(baz_, ANSWER) 

और अब BAZ सफलतापूर्वक baz_42 करने के लिए विस्तारित किया गया है। फिलहाल, यह मेरे लिए जादू की तरह लगता है।

क्या कोई मुझे इस व्यवहार को समझा सकता है? विस्तार नियम वास्तव में कैसे काम करते हैं?

+0

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

+0

@ सांडुन्धमिका: इसकी सुंदरता स्पष्ट रूप से spec-section 6.10.3 में प्रलेखित है - हालांकि कई अपरिभाषित व्यवहार कोनों हैं। –

उत्तर

7

अपने प्रश्न का जवाब here पढ़ें:

समस्या यह है कि जब आप एक मैक्रो प्रतिस्थापन, पूर्वप्रक्रमक है केवल मैक्रो रिकर्सिवली अगर न stringizing ऑपरेटर # और न ही टोकन का विस्तार होगा है -पस्टिंग ऑपरेटर ## इसके लिए लागू होते हैं। इसलिए, जब आप आप एक रिकर्सिवली विस्तार तर्क

+0

और यही कारण है कि 'BOOST_PP_CAT' है :) –

+0

ऊपर उद्धरण सही नहीं है, या कम से कम पूरा नहीं हुआ है। मैक्रो का विस्तार करने के लिए, आपको संकेत के दो स्तरों की आवश्यकता है (वीएस2017 में परीक्षण किया गया है, और जीएनयू सीपीपी में इसकी रिपोर्ट)। मैं एक स्पष्टीकरण सुनना चाहता हूं कि क्यों दूसरा स्तर का संकेत आवश्यक है। किसी भी "#" या "##" के बिना, केवल एक स्तर का संकेत होने के बाद, मैक्रो का विस्तार नहीं करता है। लेकिन दूसरा स्तर करता है। –

3

टोकन संयोजन के साथ टोकन-पेस्ट ऑपरेटर का उपयोग कर सकते हैं मैक्रो का विस्तार नहीं करता है जब संयोजन [ref] प्रदर्शन, अविवेक के लिए कुछ अतिरिक्त परतों का उपयोग करने के लिए है ।

इसे पाने के लिए, आप एक स्तर के संकेत का उपयोग करते हैं, और संप्रदाय से पहले मैक्रोज़ का विस्तार करने के लिए प्रीप्रोसेसर प्राप्त करते हैं।

#define STEP1(x, y) STEP2(x, y) // x and y will be expanded before the call to STEP2 
#define STEP2(x, y) x ## y   // x and y will not be expanded, just pasted 
संबंधित मुद्दे