2010-01-08 13 views
7

मैं एक सी नीचे कार्यक्रम है:सी (सी ++) प्रीप्रोसेसर के लिए ## का क्या अर्थ है?

#define f(g,g2) g##g2 
main() 
{ 
int var12=100; 
printf("%d",f(var,12)); 
} 

जब मैं जो कारण है कि उत्पादन 100

कर सकते है बस पूर्वप्रक्रमक के रूप में

{ 
int var12=100; 
printf("%d",var12); 
} 

यह इस फैलता चलाने कोई मुझे बताता है कि प्रीप्रोसेसर var##12 to var12 कैसे फैलाता है?

+6

क्योंकि सी प्रीप्रोसेसर में '##' का अर्थ है। यह कहने जैसा है "मैं ++' वृद्धि क्यों करता हूं? "। क्योंकि सी मानक ऐसा कहता है! –

+0

-1 स्पष्ट रूप से होमवर्क। – richo

+2

@Richo .... यह घर का काम नहीं है। मैं प्रीप्रोसेसर से ज्यादा परिचित नहीं हूं, मेरे पास यह प्रश्न मेरे दिमाग में था। यह आपके लिए आसान हो सकता है और होमवर्क की तरह दिख सकता है। लेकिन उन लोगों के लिए जो ' यह नहीं पता कि यह समझना इतना आसान नहीं है। – Vijay

उत्तर

4

देखते हैं क्योंकि सी पूर्वप्रक्रमक के लिए एक टोकन संयोजन ऑपरेटर है ## को श्रेणीबद्ध करने के लिए।

या शायद मैं सवाल समझ नहीं पा रहा हूं।

+1

की खोज करने पर Google और SO खोज दोनों विफल हो जाते हैं, यह टोकन को संगत करता है, स्ट्रिंग नहीं। –

3

##Token Pasting Operator

डबल संख्या हस्ताक्षर या "टोकन-पेस्ट" ऑपरेटर (##) है, जो कभी-कभी "विलय" ऑपरेटर कहा जाता है, दोनों वस्तु की तरह और समारोह में इस्तेमाल किया जाता है मैक्रोज़ की तरह। यह अलग टोकन को एक टोकन में शामिल होने की अनुमति देता है और इसलिए मैक्रो परिभाषा में पहला या अंतिम टोकन नहीं हो सकता है।

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

1

#define f(g,g2) g##g2

## सी पूर्वप्रक्रमक में दो मैक्रो को श्रेणीबद्ध करने के लिए usued है। तो एफ (var, 12) को संकलित करने से पहले pre12 के साथ प्रीप्रोसेसर द्वारा प्रतिस्थापित किया जाना चाहिए और इसलिए आपको आउटपुट मिला।

संबंधित मुद्दे