c++ - Why does "#define WC(p) L#p" not work in GCC and Clang? -
डेमो प्रोग्राम:
#include & lt; iostream & gt; नेमस्पेस एसटीडी का उपयोग करना; # परिभाषित WC (p) L # p int main () {wcout & lt; & lt; WC (XXX); }
यह पूरी तरह से ठीक दृश्य सी ++ पर चलता है, लेकिन लिनक्स पर क्लैग और जीसीसी दोनों पर संकलन करने में विफल रहता है। त्रुटि (वर्ण 3.4, लिनक्स):
- file.cpp: 8: 11: त्रुटि: अघोषित पहचानकर्ता 'एल' का प्रयोग
- file.cpp: 4: 15: नोट: मैक्रो 'डब्ल्यूसी' से विस्तारित किया गया
यह क्यों असफल है? सी परिभाषित करते हुए मैं एक चौड़े-चौड़े स्ट्रिंग कैसे बनाऊं? इस तरह की क्षमता मेरे मामले में कोड दोहराव को काफी कम कर देगी।
पूर्वप्रक्रमक टोकन के अनुक्रम पर चल रहा है। / P>
मैक्रो WC (p)
की परिभाषा में, प्रतिस्थापन सूची में तीन टोकन हैं: एल ,
#
, और p
। #
निश्चित रूप से एक ऑपरेटर है, जो निम्न टोकन को "स्ट्रैव करता है" महत्वपूर्ण बात यह है कि एल स्वयं के द्वारा एक टोकन है
WC (XXX) पर मैक्रो प्रतिस्थापन का परिणाम
है दो टोकन: एल
और "XXX"
।
दूसरी तरफ एक चौड़ी स्ट्रिंग, एक एकल टोकन है मैक्रो प्रतिस्थापन सूची की वर्तनी के बावजूद, दो अलग टोकनों, जहां एक एल होता है और दूसरा एक संकीर्ण स्ट्रिंग है, नहीं एक विस्तृत स्ट्रिंग का गठन शाब्दिक यह एक स्थान के साथ
एल "XXX"
जैसा होता है।
आपको दो टोकनों को एक टोकन में पेस्ट करने की आवश्यकता होती है ताकि एक विस्तृत स्ट्रिंग आभासी प्राप्त हो सके। यह निम्न समाधान सुझाता है:
#define WC (p) L ## # p
संपादित करें : हालांकि, के रूप में टिप्पणियों में बताया गया है, यह या तो काम नहीं करेगा क्योंकि भाषा यह गारंटी नहीं देती कि #
का मूल्यांकन इससे पहले कि ##
होगा। हमें पूर्वप्रक्रमक को p
को पहले स्ट्रिंग में कनवर्ट करना होगा, फिर टोकन पेस्ट करें:
# CONCAT परिभाषित करें (x, y ) एक्स # # y #define WC (पी) CONCAT (एल, # पी)
अब WC (XXX)
सबसे पहले मैक्रो प्रतिस्थापन से उत्पन्न होगा कोंकैट (एल, "XXX")
। फिर मैक्रो प्रतिस्थापन एक एकल टोकन एल "XXX"
।
Comments
Post a Comment