2010-05-01 10 views
74

कम से कम कुछ सी preprocessors आप किसी मैक्रो का मान stringize, बल्कि जैसा कि इसके नाम से, एक और है कि यह stringizes करने के लिए एक समारोह की तरह मैक्रो के माध्यम से पारित करके करते हैं:डबल-स्ट्रिंगज चाल काम कैसे करता है?

#define STR1(x) #x 
#define STR2(x) STR1(x) 
#define THE_ANSWER 42 
#define THE_ANSWER_STR STR2(THE_ANSWER) /* "42" */ 

उदाहरण उपयोग के मामलों here

यह कम से कम जीसीसी और क्लैंग (-std=c99 के साथ) में काम करता है, लेकिन मुझे यकीन नहीं है कि यह सी-मानक शर्तों में कैसे काम करता है।

क्या यह व्यवहार सी 99 द्वारा गारंटीकृत है?
यदि हां, तो सी 99 इसकी गारंटी कैसे देता है?
यदि नहीं, तो व्यवहार सी-परिभाषित से जीसीसी-परिभाषित करने के लिए किस बिंदु पर जाता है?

+1

यदि आप "कम से कम कुछ" कहते हैं, तो क्या इसका मतलब है कि आपने एक ऐसा देखा है जहां यह काम नहीं करता है? मैं विक्रेता को एक बग रिपोर्ट लिखने के लिए तैयार हूं। – Jens

+0

@ जेन्स: नहीं; मैंने नहीं किया मैंने उपयोग किए गए प्रत्येक कंपाइलर (अर्थात्, जीसीसी और क्लैंग) इस व्यवहार को लागू करता है। –

उत्तर

69

हां, इसकी गारंटी है।

यह काम करता है क्योंकि मैक्रोज़ के लिए तर्क खुद को मैक्रो-विस्तारित, को छोड़कर जहां मैक्रो बॉडी नाम स्ट्रिंगफायर # या टोकन-पॉस्टर ## के साथ मैक्रो बॉडी नाम में दिखाई देता है।

6.10.3.1/1:

... एक समारोह की तरह, मैक्रो पहचान की गई है तर्क प्रतिस्थापन जगह लेता है की मंगलाचरण के लिए बहस के बाद। प्रतिस्थापन सूची में एक पैरामीटर , जब तक एक # से पहले या ## preprocessing टोकन या टोकन (नीचे देखें) preprocessing एक ## द्वारा पीछा किया, सभी मैक्रो के बाद इसी तर्क ने ले ली है उसमें निहित किया गया है विस्तार ...

इसलिए, यदि आप, STR1(THE_ANSWER) तो आप "THE_ANSWER" मिलता है क्योंकि str1 का तर्क नहीं है वृहद विस्तार किया। हालांकि, एसटीआर 2 का तर्क मैक्रो-विस्तारित है जब इसे एसटीआर 2 की परिभाषा में प्रतिस्थापित किया गया है, जिससे "42" के परिणामस्वरूप एसटीआर 1 42 का तर्क देता है।

19

स्टीव नोट, इस guarenteed है, और यह C89 मानक के बाद से guarenteed किया गया है - कि था मानक संहिताबद्ध मैक्रो और रिकर्सिवली प्रतिस्थापन से पहले आर्ग में मैक्रो का विस्तार जनादेश में # और ## ऑपरेटरों उन्हें शरीर में अगर और केवल अगर शरीर # या ## तर्क पर लागू नहीं करता है। सी 99 इस संबंध में सी 8 9 से अपरिवर्तित है।

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