सी

2010-02-03 3 views
21

में दो तारों को संयोजित करने के लिए मैक्रो मैं एक मैक्रो को परिभाषित करने की कोशिश कर रहा हूं जो 2 स्ट्रिंग मानों को लेने का अनुमान लगाता है और उन्हें उनके बीच एक स्थान के साथ संयोजित करता है। यह मैं किसी भी चरित्र मैं अंतरिक्ष के अलावा चाहते हैं, उदाहरण के लिए उपयोग कर सकते हैं लगता है:सी

#define conc(str1,str2) #str1 ## #str2 
#define space_conc(str1,str2) conc(str1,-) ## #str2 

space_conc(idan,oop); 

space_conc वापसी होगी "Idan-OOP"

मैं वापस जाने के लिए कुछ चाहते हैं "Idan OOP", सुझाव?

उत्तर

48

इस

#define space_conc(str1,str2) #str1 " " #str2 

'##' प्रतीक, नहीं तार जोड़ लिए किया जाता है की कोशिश करो। स्ट्रिंग्स को सी में आसानी से जोड़ा जा सकता है, और संकलक उन्हें जोड़ देगा, जो यह मैक्रो करता है। सबसे पहले str1 और str2 तारों में बदल जाता है (आइए हम "हैलो" और "दुनिया" कहें यदि आप इसे space_conc(hello, world) की तरह उपयोग करते हैं) और उन्हें सरल, एकल-स्थान, स्ट्रिंग के बीच एक-दूसरे के आगे रखता है। यही कारण है, जिसके परिणामस्वरूप विस्तार इस

"hello" " " "world" 

तरह संकलक द्वारा दर्शाया जाएगा जो इसे पूर्णता के लिए

"hello world" 

को जोड़ देंगे HTH

संपादित
, '# # 'मैक्रो विस्तार में ऑपरेटर इस तरह प्रयोग किया जाता है, मान लीजिए कि आपके पास

है 210

निम्नलिखित में परिणाम होगा अगर dumb_macro(hello, world)

helloworld 

जो एक स्ट्रिंग नहीं है के रूप में कहा जाता है, लेकिन एक प्रतीक और आप शायद एक अपरिभाषित प्रतीक त्रुटि के साथ खत्म हो जाएगा कह रही है 'HelloWorld' जब तक अस्तित्व में नहीं है आप इसे पहले परिभाषित करते हैं। यह कानूनी होगा:

int helloworld; 
dumb_macro(hello, world) = 3; 
printf ("helloworld = %d\n", helloworld); // <-- would print 'helloworld = 3' 
+2

ध्यान रखें कि यह जरूरी गूंगा आप की तरह 'dumb_macro (mypackage, myfunction)' ... –

+0

@R कुछ कर रहे हैं नहीं है, बेशक अवधारणा, का उपयोग करता है, लेकिन यह आम तौर पर जुड़ा हुआ है। कुछ अन्य अर्थपूर्ण मूल्य, या किसी अन्य चीज़ के साथ मैक्रो को प्रतिस्थापित करने का विकल्प (जैसे, डिबगिंग उद्देश्यों के लिए)। मैं इस तरह के किसी भी चीज़ में डुबकी नहीं लेना चाहता था, इसलिए यह विशेष व्यक्ति सिर्फ एक गूंगा मैक्रो है जो किसी भी वास्तविक उद्देश्य के लिए दो प्रतीक नामों को जोड़ता है ... :) – falstro

+0

जो एक अच्छा जवाब है। जानना चाहता था कि प्रतीक प्रतीक कैसे करें। यह वास्तव में उपयोगी है .. – Anubis

5
#define space_conc(str1, str2) #str1 " " #str2 
printf("%s", space_conc(hello, you)); // Will print "hello you" 
0

सही करना था कि दूसरे तारों को एक दूसरे के आगे रखें। '##' काम नहीं करेगा। बस:

#define concatenatedstring string1 string2