मैं एक अभिकथन के इस उदाहरण में आए का उपयोग कर स्वरूपण और सोच रहा था क्या #
के लिए है के लिए # है:क्या% s
#define ASSERT(x) if (!(x)) { \
int *p = NULL; \
DBGPRINTF("Assert failed: [%s]\r\n Halting.", #x); \
*p=1; \
}
मैं एक अभिकथन के इस उदाहरण में आए का उपयोग कर स्वरूपण और सोच रहा था क्या #
के लिए है के लिए # है:क्या% s
#define ASSERT(x) if (!(x)) { \
int *p = NULL; \
DBGPRINTF("Assert failed: [%s]\r\n Halting.", #x); \
*p=1; \
}
#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
}
यह "स्ट्रिंग" प्रीप्रोकैसिंग ऑपरेटर है।
यह टोकन को मैक्रो पैरामीटर x
पर तर्क के रूप में पारित करता है और उन्हें एक स्ट्रिंग अक्षर में बदल देता है।
#define ASSERT(x) #x
ASSERT(a b c d)
// is replaced by
"a b c d"
#
पूर्वप्रक्रमक के "stringizing" operator है। यह स्ट्रिंग अक्षर में मैक्रो पैरामीटर बदल जाता है। यदि आपने मैक्रो के मूल्यांकन के दौरान ASSERT(foo >= 32)
#x
को "foo >= 32"
पर विस्तारित किया है।
यह एक प्रीप्रोसेसर सुविधा है जिसे stringification कहा जाता है। यह
वास्तविक तर्क के शाब्दिक पाठ के साथ [मैक्रो पैरामीटर] को प्रतिस्थापित करता है, जो स्ट्रिंग स्थिर में परिवर्तित होता है।
यह स्ट्रिंगिंग ऑपरेटर है।
http://msdn.microsoft.com/en-us/library/7e3a913x(v=vs.80).aspx
आपको क्या दिखाई stringification कहा जाता है। यह आपको एक स्ट्रिंग अक्षर में मैक्रो के तर्क को बदलने की अनुमति देता है। आप यहां http://gcc.gnu.org/onlinedocs/cpp/Stringification.html के बारे में अधिक पढ़ सकते हैं।
#
धारा 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"
होने की जरूरत नहीं।
क्या ऐसी कोई परिस्थितियां हैं जिसके अंतर्गत "प्रतिस्थापन जो परिणाम वैध वर्ण स्ट्रिंग अक्षर नहीं है"? मैं किसी के बारे में नहीं सोच सकता। –
@ जेम्स मैकनेलिस: "द न्यू सी स्टैंडर्ड" में एक उदाहरण मिला, मेरी पोस्ट देखें। –
दिलचस्प। "प्रीप्रोकैसिंग टोकन अनुक्रम की वर्तनी" (सी ++ से) की मेरी समझ यह है कि कंपाइलर को किसी भी आवश्यक भागने की आवश्यकता होती है, इसलिए 'mkstr ("a") '' \ "\" "' '' ' "" एक "" '। शायद यह गैर-व्हाइटस्पेस टोकन पर लागू नहीं होता है? –
वाह ...कभी-कभी आप एक मिनट में इतने सारे उत्तर प्राप्त कर सकते हैं :) –