2010-08-05 7 views
39

के परिणाम को स्ट्रिंगिफ़ाई करना मैं मैक्रो विस्तार के परिणाम को स्ट्रिंग करना चाहता हूं।सी प्रीप्रोसेसर, मैक्रो

मैं निम्नलिखित के साथ की कोशिश की है:

#define QUOTE(str) #str 
#define TEST thisisatest 
#define TESTE QUOTE(TEST) 

और TESTE करने के लिए विस्तारित हो जाता है: "टेस्ट" जब मैं "thisisatest" पाने के लिए कोशिश कर रहा हूँ। मुझे पता है कि यह प्रीप्रोसेसर का सही व्यवहार है, लेकिन क्या कोई मुझे दूसरे को प्राप्त करने के तरीके से मदद कर सकता है?

Using TESTE #TEST is not valid 
Using TESTE QUOTE(thisisatest) is not what I'm trying to do 
+1

http://stackoverflow.com/questions/798221/c-macros-to-create-strings –

उत्तर

68
इस तरह

:

#include <stdio.h> 

#define QUOTE(str) #str 
#define EXPAND_AND_QUOTE(str) QUOTE(str) 
#define TEST thisisatest 
#define TESTE EXPAND_AND_QUOTE(TEST) 

int main() { 
    printf(TESTE); 
} 

कारण जब मैक्रो तर्क मैक्रो शरीर में प्रतिस्थापित कर रहे हैं, वे का विस्तार कर रहे हैं कि जब तक वे कहते हैं कि मैक्रो में # या ## पूर्वप्रक्रमक ऑपरेटरों के साथ दिखाई देते हैं । तो, str (आपके कोड में मूल्य TEST के साथ) QUOTE में विस्तारित नहीं किया गया है, लेकिन इसे EXPAND_AND_QUOTE में विस्तारित किया गया है।

+0

+1 धन्यवाद बहुत कुछ: डी – almosnow

13

थोड़ा और स्पष्ट करने के लिए, अनिवार्य रूप से प्रीप्रोसेसर को "चरण" निष्पादित करने के लिए बनाया गया था। अर्थात्:

1 मामला:

->TESTE 
->QUOTE(TEST) # preprocessor encounters QUOTE 
# first so it expands it *without expanding its argument* 
# as the '#' symbol is used 
->TEST 

2 मामला:

->TESTE 
->EXPAND_AND_QUOTE(TEST) 
->QUOTE(thisisatest) 
    # after expanding EXPAND_AND_QUOTE 
    # in the previous line 
    # the preprocessor checked for more macros 
    # to expand, it found TEST and expanded it 
    # to 'thisisatest' 
->thisisatest