मुझे पता है कि मूल प्रश्न के बाद यह एक लंबा समय है, लेकिन यह अभी भी उपयोगी हो सकता है।
यह जीसीसी में स्ट्रिंग ऑपरेटर "#" का उपयोग करके किया जा सकता है, लेकिन इसके लिए दो चरणों की आवश्यकता होती है।
#define XSTR(x) STR(x)
#define STR(x) #x
मैक्रो का मान तब प्रदर्शित किया जा सकता है:
#pragma message "The value of ABC: " XSTR(ABC)
देखें: 3.4 जीसीसी ऑनलाइन प्रलेखन में स्ट्रिंग।
यह काम किस प्रकार करता है:
प्रीप्रोसेसर कोटेड स्ट्रिंग्स को समझता है और उन्हें सामान्य टेक्स्ट से अलग तरीके से हैंडल करता है। स्ट्रिंग कॉन्फैनेटेशन इस विशेष उपचार का एक उदाहरण है। संदेश प्रागमा के लिए एक तर्क की आवश्यकता होती है जो एक उद्धृत स्ट्रिंग है। जब तर्क के लिए एक से अधिक घटक होते हैं तो वे सभी तार होने चाहिए ताकि स्ट्रिंग संघनन लागू हो सके। प्रीप्रोसेसर कभी भी यह नहीं मान सकता है कि एक अछूता स्ट्रिंग का इलाज किया जाना चाहिए जैसे कि इसे उद्धृत किया गया था। यदि यह तब किया:
#define ABC 123
int n = ABC;
संकलन नहीं होगा।
अब विचार करें:
#define ABC abc
#pragma message "The value of ABC is: " ABC
जो के बराबर है
#pragma message "The value of ABC is: " abc
यह एक प्रीप्रोसेसर चेतावनी का कारण बनता है क्योंकि एबीसी (अनक्विओटेड) को पूर्ववर्ती स्ट्रिंग के साथ समाहित नहीं किया जा सकता है।
अब प्रीप्रोसेसर स्ट्राइज़ पर विचार करें (जिसे कभी स्ट्रिंग कहा जाता था, संशोधित शब्दावली में प्रतिबिंबित करने के लिए दस्तावेज़ीकरण में लिंक बदल दिए गए हैं। आपके लिंक।)) ऑपरेटर। यह केवल एक मैक्रो के तर्कों पर कार्य करता है और अनपेक्षित तर्क को दोहरे उद्धरण चिह्नों में संलग्न तर्क से बदल देता है। इस प्रकार:
#define STR(x) #x
char *s1 = "abc";
char *s2 = STR(abc);
s1 और s2 के समान मान निर्दिष्ट करेगा। यदि आप gcc -E चलाते हैं, तो आप इसे आउटपुट में देख सकते हैं। शायद STR को ENQUOTE जैसा कुछ नाम दिया जाएगा।
यह एक अयोग्य वस्तु के चारों ओर उद्धरण लगाने की समस्या को हल करता है, अब समस्या यह है कि, यदि तर्क एक मैक्रो है, तो मैक्रो का विस्तार नहीं किया जाएगा। यही कारण है कि दूसरे मैक्रो की जरूरत है। XSTR ने अपने तर्क का विस्तार किया, फिर विस्तारित मान को उद्धरण में रखने के लिए STR को कॉल करता है।