2009-11-06 6 views
6

a##b & #a क्या है?यह सी कोड कैसे काम करता है?

#define f(a,b) a##b 
    #define g(a) #a 
    #define h(a) g(a) 

    main() 
    { 
      printf("%s\n",h(f(1,2))); //how should I interpret this?? [line 1] 
      printf("%s\n",g(f(1,2))); //and this? [line 2] 
    } 

यह प्रोग्राम कैसे काम करता है?


उत्पादन

12 
f(1, 2) 

अब मुझे समझ में कैसे a##b & #a काम है। लेकिन परिणाम दो मामलों (लाइन 1 और लाइन 2) में अलग क्यों है?

+3

में परिवर्तित किया गया है जब आप उस प्रोग्राम को चलाते हैं तो क्या होता है? ऐसा करने से आपको यह समझने में मदद करनी चाहिए कि क्या हो रहा है। –

+1

असल में, उस कोड के साथ थोड़ी देर खेलना प्रकाश डालेगा। और यदि आपके पास विशिष्ट प्रश्न हैं तो उन्हें यहां पूछने के लिए स्वतंत्र हो गया है। – sharptooth

उत्तर

19

## दो टोकन एक साथ संयोजित हो जाएगा। इसका उपयोग केवल प्रीप्रोसेसर में ही किया जा सकता है।

f(1,2)1 ## 212 बन जाता है।

# ऑपरेटर से ही stringifies टोकन: #a"a" हो जाता है। इसलिए, g(f(1,2))"f(1,2)" बन जाता है जब प्रीप्रोसेसर इसके साथ किया जाता है।

h(f(1,2)) प्रभावी रूप से #(1 ## 2) है जो #12 बन जाता है जो "12" बन जाता है क्योंकि प्रीप्रोसेसर इसके ऊपर चलता है।

4

एक ## बी कोड टोगर पेस्ट करेगा।

तो च

(1,2) 12

+2

यह समस्या का केवल आधा है। –

0

एक ## ख, शाब्दिक ए और बी की स्ट्रिंग contatenation है तो च (1,2) "12"

#a है स्ट्रिंग शाब्दिक एक है, तो जी (3) है "3"

3

एफ (ए, बी) मैक्रो अपने तर्कों को जोड़ता है, जी (ए) अपने तर्कों को एक स्ट्रिंग में बदल देता है और एच (ए) जी (ए) के लिए सहायक मैक्रो है। मुझे लगता है कि यह होगा उत्पादन:

12 
f(1,2) 

कारण यह है कि ज (क) मैक्रो अपने तर्क यह छ पार करने से पहले विस्तार पूरा होने के लिए कारण बनता है (क), जबकि जी (क) अपने तर्कों के विस्तार के बिना सचमुच ले जाएगा उन्हें पहले।

+0

दूसरा प्रिंटफ '12" के बजाय 'f (1,2)" 'में क्यों समाप्त होता है? – Moeb

+0

ऐसा क्यों होता है: "कारण यह है कि एच (ए) मैक्रो जी (ए) को पार करने से पहले अपने तर्क को पूर्ण रूप से विस्तारित करने का कारण बनता है जबकि जी (ए) सचमुच उन्हें विस्तारित किए बिना अपने तर्क लेगा।" ? – Moeb

0

## मैक्रो कॉन्सटेनेशन ऑपरेटर है। तो उदाहरण के लिए f(foo,bar)foobar के बराबर होगा।

5

इन जैसे प्रश्नों के लिए (और प्रीप्रोसेसर के साथ "वास्तविक दुनिया" समस्याओं को भी करने के लिए), मुझे के बाद कोड को वास्तव में पढ़ने में बहुत मददगार लगता है, इसे प्रीप्रोसेस्ड किया गया है।

कैसे इस संकलक के साथ बदलता रहता ऐसा करने के लिए, लेकिन जीसीसी के साथ, तो आप इस का प्रयोग करेंगे:

$ gcc -E test.c 

(snip) 
main() 
{ 
     printf("%s\n","12"); 
     printf("%s\n","f(1,2)"); 
} 

तो, आप देख सकते हैं कि प्रतीकों दोनों किया गया है श्रेणीबद्ध, और एक स्ट्रिंग में बदल गया।

+0

दूसरा प्रिंटफ '12" 'के बजाय' f (1,2) "' में क्यों समाप्त होता है? – Moeb

+0

@hanifr: क्योंकि जी() मैक्रो इसके तर्क को मजबूत करता है, मुझे लगता है। – unwind

0
 
    #define f(a,b) a##b 
    #define g(a) #a 
    #define h(a) g(a) 

तो, ## 2 भागों सीधे एक साथ जोड़, कोई बात नहीं क्या प्रकार वे कर रहे हैं ... आप एक उदाहरण दें .. printf("%d\n",f(1,2)); आप 12 मिलता है, च यहाँ मतलब यह है कि (1,2) 12 है एक पूर्णांक

 
    int a2 = 100; 
    printf("%d\n",f(a,2)); 

यहां एफ (ए, 2) लेबल है। यह आपके कोड संदर्भ में एक लेबल को इंगित करता है, यदि int a2 = 100 नहीं है, तो आपको संकलन त्रुटियां मिलती हैं। और #a बदल जाता है जो कुछ भी एक एक स्ट्रिंग में, है ... और फिर h(a) g(a) यह बहुत ही अजीब .. ऐसा लगता है कि जब आप ज फोन (क), यह छ (क) में बदल जाता है, और ग्राम में एक से गुजरता है (ए), सबसे पहले, यह व्याख्या करता है कि क्या है। इसलिए, इससे पहले कि आप g (ए) कर सकें, एक को f (a, b) = a ## b = 12

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

  • कोई संबंधित समस्या नहीं^_^