How to compose valid token depending on pre-defined macros (C++ preprocessor)? -


मान लें कि कुछ टोकन FOO , बार , और DUD (और संभवतः अधिक) #defined हैं या नहीं मैं एक मैक्रो विस्तार (नाम) करना चाहता हूं जो एक वैध विस्तारित नाम उत्पन्न करता है, उदा।

  #define FOO #undef bar #define DUD विस्तार (ऑब्जेक्ट) < / code>  

का विस्तार

  object_foo_dud   

क्या मैक्रो EXTEND कम से कम लिखना संभव है अगर n मैक्रो टोकन (जैसे FOO , बार , और n ) लाइनों की तुलना में > DUD )? मुझे लगता है कि यह (ओ) लाइनों के साथ संभव होना चाहिए, लेकिन कैसे?

मैंने इस कोशिश की है :

  #ifdef FOO # ExtFOO (name) name ## _foo #else # define ExtFOO (name) name #endif #ifdef BAR # परिभाषित एक्स्टबैर (नाम) ExtFOO (name) ## _bar #else # परिभाषित ExtBAR (name) ExtFOO (name) #endif #ifdef DUD # परिभाषित करें ExtDUD (नाम) ExtBAR (name) ## _dud #else # परिभाषित करें ExtDUD (name) ExtBAR (name) #endif #define EXTEND (नाम) ExtDUD (name)   

लेकिन

test.cc.citter: त्रुटि: पेस्टिंग का गठन ') _dud', एक अवैध प्रीप्रोसेटिंग टोकन
EXTEND (ऑब्जेक्ट)
^

## ऑपरेटर दो प्रीप्रोसेसिंग टॉकेन को सम्मिलित करता है और उन्हें सिंगल मान्य टोकन उदाहरण के लिए, सीएजी स्पेस के खंड 6.10.3.3 से:

ऑब्जेक्ट-जैसे और फंक्शन-जैसी मैक्रो इनोकॉशंस दोनों के लिए, प्रतिस्थापन सूची को बदलने के लिए अधिक मैक्रो नामों के लिए पुन: विश्लेषण किया जाता है, प्रत्येक आवृत्ति प्रतिलिपि सूची (कोई तर्क से नहीं) में एक ## प्रीप्रोसिटिंग टोकन का हटाया जाता है और पूर्ववर्ती प्रीप्रोसेसिंग टोकन निम्न प्रीप्रोसेटिंग टोकन के साथ जोड़ दिया जाता है। प्लेसमार्कर प्रीप्रोसेटिंग टोकन विशेष रूप से नियंत्रित किए जाते हैं: एकल प्लेसमार्कर प्रीप्रोसेटिंग टोकन में दो प्लेमार्क्सर्स परिणाम को जोड़ना, और गैर-प्लेसमार्कर प्रीप्रोसेटिंग टोकन में गैर-प्लेमार्कर प्रीप्रोसेसिंग टोकन परिणामों के साथ एक स्थल-चिह्न के संयोजन। यदि परिणाम मान्य प्रीप्रोसेसिंग टोकन नहीं है, तो व्यवहार अपरिभाषित है। परिणामस्वरूप टोकन आगे मैक्रो प्रतिस्थापन के लिए उपलब्ध है। ## ऑपरेटरों के मूल्यांकन का क्रम अनिर्दिष्ट है।

तो विस्तार ExtBAR (name) ## _dud अमान्य है क्योंकि यह ExtBAR (वस्तु) _dud उत्पन्न होगा।

मैं निम्नलिखित दृष्टिकोण से जाना था:

  #ifdef FOO # define ValFOO _foo #else # परिभाषित करें ValFOO #endif #ifdef BAR # define ValBAR _bar #else # परिभाषित करें ValBAR #endif #ifdef DUD # ValDUD को परिभाषित करें _dud # # # परिभाषित करें ValDUD #endif #define CONCAT (a, b, c, d) a ## b # # C ##d #define XCONCAT (a, b, c, d) CONCAT (a, b, c, d) #define EXTEND (नाम) XCONCAT (नाम, ValFOO, ValBAR, ValDUD)   

मध्यवर्ती XCONCAT चरण की आवश्यकता है क्योंकि मैक्रो तर्कों का विस्तार नहीं किया जाता है यदि वे ## का उपयोग करते हुए संमिलित होते हैं।

Comments

Popular posts from this blog

Pass DB Connection parameters to a Kettle a.k.a PDI table Input step dynamically from Excel -

multithreading - PhantomJS-Node in a for Loop -

c++ - MATLAB .m file to .mex file using Matlab Compiler -