2011-03-18 14 views
5

मैं एक अभिकथन के इस उदाहरण में आए का उपयोग कर स्वरूपण और सोच रहा था क्या # के लिए है के लिए # है:क्या% s

#define ASSERT(x) if (!(x)) { \ 
    int *p = NULL; \ 
    DBGPRINTF("Assert failed: [%s]\r\n Halting.", #x); \ 
    *p=1; \ 
    } 

उत्तर

4

#x stringification निर्देश

#define Stringify(x) #x

है

का अर्थ है Stringify(abc)"abc"

के साथ प्रतिस्थापित किया जाएगा

#define initVarWithItsOwnName(x) const char* p = #x 

int main() 
{ 
    initVarWithItsOwnName(Var); 
    std::cout << Var; //will print Var 
} 
9

यह "स्ट्रिंग" प्रीप्रोकैसिंग ऑपरेटर है।

यह टोकन को मैक्रो पैरामीटर x पर तर्क के रूप में पारित करता है और उन्हें एक स्ट्रिंग अक्षर में बदल देता है।

#define ASSERT(x) #x 

ASSERT(a b c d) 
// is replaced by 
"a b c d" 
3

# पूर्वप्रक्रमक के "stringizing" operator है। यह स्ट्रिंग अक्षर में मैक्रो पैरामीटर बदल जाता है। यदि आपने मैक्रो के मूल्यांकन के दौरान ASSERT(foo >= 32)#x को "foo >= 32" पर विस्तारित किया है।

2

यह एक प्रीप्रोसेसर सुविधा है जिसे stringification कहा जाता है। यह

वास्तविक तर्क के शाब्दिक पाठ के साथ [मैक्रो पैरामीटर] को प्रतिस्थापित करता है, जो स्ट्रिंग स्थिर में परिवर्तित होता है।

0

आपको क्या दिखाई stringification कहा जाता है। यह आपको एक स्ट्रिंग अक्षर में मैक्रो के तर्क को बदलने की अनुमति देता है। आप यहां http://gcc.gnu.org/onlinedocs/cpp/Stringification.html के बारे में अधिक पढ़ सकते हैं।

+0

वाह ...कभी-कभी आप एक मिनट में इतने सारे उत्तर प्राप्त कर सकते हैं :) –

2

# धारा 6.10.3.2 (सी 99) और धारा 16.3.2 में परिभाषित स्ट्रिंगिंग ऑपरेटर है। (सी ++ 03)

यह पैरामीटर परिभाषा को विस्तार किए बिना स्ट्रिंग अक्षर तक मैक्रो पैरामीटर को परिवर्तित करता है।

प्रतिस्थापन कि परिणाम मान्य वर्ण स्ट्रिंग शाब्दिक नहीं है, तो व्यवहार अपरिभाषित है। # ऑपरेटर के मूल्यांकन का आदेश अनिर्दिष्ट है।

उदाहरण के लिए, वाक्य रचनात्मक रूप से, स्ट्रिंग अक्षर में बैकस्लैश वर्ण की घटनाएं बचने के दृश्यों तक सीमित हैं।

निम्न उदाहरण में:

1  #define mkstr(x) # x 
2  char *p = mkstr(a \ b); 
     /* "a \ b" violates the syntax of string literals */ 

# ऑपरेटर का परिणाम "a \ b" होने की जरूरत नहीं।

+1

क्या ऐसी कोई परिस्थितियां हैं जिसके अंतर्गत "प्रतिस्थापन जो परिणाम वैध वर्ण स्ट्रिंग अक्षर नहीं है"? मैं किसी के बारे में नहीं सोच सकता। –

+0

@ जेम्स मैकनेलिस: "द न्यू सी स्टैंडर्ड" में एक उदाहरण मिला, मेरी पोस्ट देखें। –

+0

दिलचस्प। "प्रीप्रोकैसिंग टोकन अनुक्रम की वर्तनी" (सी ++ से) की मेरी समझ यह है कि कंपाइलर को किसी भी आवश्यक भागने की आवश्यकता होती है, इसलिए 'mkstr ("a") '' \ "\" "' '' ' "" एक "" '। शायद यह गैर-व्हाइटस्पेस टोकन पर लागू नहीं होता है? –

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