c++ - Why string concat macro doesn't work for this "+" case? -
संक्षिप्त प्रश्न:
क्या इसे विशेष संकेत जैसे " +
, -
स्ट्रिंग कॉकटालेनेशन मैक्रो ##
के लिए? उदाहरण के लिए,
#define OP (var) ऑपरेटर ## var
ओपी (+)
को विस्तारित किया जाएगा < कोड> ऑपरेटर + ?
सटीक समस्या:
#include "z3 ++। H" #include & lt; unordered_map & gt; नेमस्पेस z3 {z3 :: एक्सपीआर ऑपरेटर + (z3 :: एक्सपीआर कंसल्ट & amp;, ज़् 3 :: एक्सपीआरआर & amp;;); } टाइप-फेड ज़ 3 :: एक्सप्र (* माइऑपरेटर टी) (ज़् 3 :: एक्सपीआरआर & amp ;, ज़्ज़ेई :: एक्सपीआरआर कंस & amp;;); #define STR (var) #var #define z3Op (var) static_cast & lt; MyOperatorTy & gt; (& amp; z3 :: ऑपरेटर ## var) #define StrOpPair (var) \ {STR (var), z3Op (var)} शून्य परीक्षण ( ) {Std :: unordered_map & lt; std :: string, MyOperatorTy & gt; StrOpMap1 {{"+", स्टेटिक_कास्ट & lt; MyOperatorTy & gt; (& amp; z3 :: ऑपरेटर +)}}; // fine std :: unordered_map & lt; std :: string, MyOperatorTy & gt; strOpMap2 {StrOpPair (+)}; // त्रुटि}
का उपयोग करते समयstrOpMap2
के लिएclang ++ -c -st-cd = c ++ 11
का उपयोग करके, यह रिपोर्ट करता है: g ++ -c -std = c ++ 11त्रुटि: पेस्टिंग का गठन 'ऑपरेटर +', एक अवैध प्रीप्रोसेटिंग टोकन
यह देता है:
त्रुटि: चिपकाने वाला "ऑपरेटर" और "+" एक वैध प्रीप्रोसेटिंग टोकन नहीं देता
पढ़ने से मुझे लगता है कि यह संभव होना चाहिए Concat, लेकिन क्यों दोनों संकलक त्रुटियों का उत्सर्जन करते हैं?
आप अन्य विराम चिह्नों को बनाने के लिए विराम चिह्न पेस्ट कर सकते हैं, उदा।
<पूर्व> #define पेस्ट (ए, बी) एक ## बी int main () {int i = 0; मैं पेस्ट (+, +); // i == 1 अब}
##
ऑपरेटर अन्य प्रीप्रोसेसिंग टॉकेन से वैध प्रीप्रोसेटिंग टोकन का निर्माण करने के लिए है चिपकाने का परिणाम एक मान्य प्रीप्रोसेटिंग टोकन होना चाहिए। इसलिए यह मान्य नहीं है:
पेस्ट (i, ++)
क्योंकि i ++
एक प्रीप्रोसेटिंग टोकन नहीं है; यह संभव है कि दो आसन्न टोकन i
और ++
।
संभव टोकन की सूची है (N3797):
- शीर्षक-नाम
- पहचानकर्ता
- पीपी-संख्या
- अक्षर-शाब्दिक
- उपयोगकर्ता-परिभाषित-वर्ण-शाब्दिक < Li-string-literal
- उपयोगकर्ता-परिभाषित-स्ट्रिंग-शाब्दिक
- प्रीप्रोसेसिंग- op-or-punc
- प्रत्येक गैर-सफेद-स्पेस वर्ण जो नहीं हो सकता उपरोक्त में से एक
नोट: प्रीप्रोसेसिंग चरण पर, कीवर्ड मौजूद नहीं है; लेकिन प्रीप्रोसेसिंग के बाद, किसी भी पहचानकर्ता को कीवर्ड होना चाहिए (शब्दात्मक रूप से) कीवर्ड में। तो आप छोटे शब्दों को चिपकाकर कीवर्ड बना सकते हैं।
आपके कोड में ऑपरेटर
दो टोकन हैं: ऑपरेटर
और +
। तो आप इसे ##
के साथ नहीं बनाते हैं; आप बस एक दूसरे को करते हैं।
#define OP (punc) ऑपरेटर punc
Comments
Post a Comment