यदि आप USER को एक उद्धृत स्ट्रिंग के रूप में परिभाषित करते हैं तो आप ऐसा नहीं कर सकते।
लेकिन आप यह कर सकते हैं कि यदि USER सिर्फ JACK या QUEEN या जोकर या जो भी हो।
उपयोग करने के लिए दो तरकीबें हैं:
- टोकन-स्प्लिसिंग, जहाँ आप एक पहचानकर्ता को किसी अन्य पहचानकर्ता से मिलाते हैं, केवल उनके पात्रों को संक्षिप्त करके। यह आपको
#define JACK
कुछ के बिना JACK के खिलाफ तुलना करने की अनुमति देता है
- परिवर्तनशील मैक्रो विस्तार, जो आपको मैक्रोज़ को तर्क संख्याओं के चर के साथ संभालने की अनुमति देता है। यह आपको विशिष्ट पहचानकर्ताओं को अल्पविरामों की बदलती संख्या में विस्तारित करने की अनुमति देता है, जो आपकी स्ट्रिंग तुलना बन जाएगा।
तो चलिए शुरू करते हैं:
#define JACK_QUEEN_OTHER(u) EXPANSION1(ReSeRvEd_, u, 1, 2, 3)
अब, अगर मैं लिखता हूं JACK_QUEEN_OTHER(USER)
, और USER JACK है, तो प्रीप्रोसेसर बदल जाता हैEXPANSION1(ReSeRvEd_, JACK, 1, 2, 3)
चरण दो संघात है:
#define EXPANSION1(a, b, c, d, e) EXPANSION2(a##b, c, d, e)
अब JACK_QUEEN_OTHER(USER)
बन जाता हैEXPANSION2(ReSeRvEd_JACK, 1, 2, 3)
यह एक स्ट्रिंग मैच के अनुसार कई अल्पविराम जोड़ने का अवसर देता है:
#define ReSeRvEd_JACK x,x,x
#define ReSeRvEd_QUEEN x,x
यदि USER JACK है, JACK_QUEEN_OTHER(USER)
बन जाता हैEXPANSION2(x,x,x, 1, 2, 3)
यदि USER QUEEN है, JACK_QUEEN_OTHER(USER)
बन जाता हैEXPANSION2(x,x, 1, 2, 3)
यदि USER अन्य है, तो JACK_QUEEN_OTHER(USER)
बन जाता हैEXPANSION2(ReSeRvEd_other, 1, 2, 3)
इस बिंदु पर, कुछ महत्वपूर्ण हुआ है: EXPANSION2 मैक्रो का चौथा तर्क या तो 1, 2, या 3 है, यह इस बात पर निर्भर करता है कि पास किया गया मूल तर्क जैक, क्वीन, या कुछ और था। तो हमें बस इतना करना है कि इसे बाहर निकालें। लंबे समय से घुमावदार कारणों से, हमें अंतिम चरण के लिए दो मैक्रो की आवश्यकता होगी; वे EXPANSION2 और EXPANSION3 होंगे, भले ही कोई अनावश्यक लगे।
यह सब एक साथ रखकर, हमारे पास ये 6 मैक्रो हैं:
#define JACK_QUEEN_OTHER(u) EXPANSION1(ReSeRvEd_, u, 1, 2, 3)
#define EXPANSION1(a, b, c, d, e) EXPANSION2(a##b, c, d, e)
#define EXPANSION2(a, b, c, d, ...) EXPANSION3(a, b, c, d)
#define EXPANSION3(a, b, c, d, ...) d
#define ReSeRvEd_JACK x,x,x
#define ReSeRvEd_QUEEN x,x
और आप उन्हें इस तरह उपयोग कर सकते हैं:
int main() {
#if JACK_QUEEN_OTHER(USER) == 1
printf("Hello, Jack!\n");
#endif
#if JACK_QUEEN_OTHER(USER) == 2
printf("Hello, Queen!\n");
#endif
#if JACK_QUEEN_OTHER(USER) == 3
printf("Hello, who are you?\n");
#endif
}
अप्रचलित देवभूमि लिंक: https://godbolt.org/z/8WGa19