इस कोड टुकड़ा को ध्यान में रखते:printf को CSTring के वर्ण डेटा के पते को कैसे पता है?
struct My {
operator const char*()const{ return "my"; }
} my;
CStringA s("aha");
printf("%s %s", s, my);
// another variadic function to get rid of comments about printf :)
void foo(int i, ...) {
va_list vars;
va_start(vars, i);
for(const char* p = va_arg(vars,const char*)
; p != NULL
; p=va_arg(vars,const char*))
{
std::cout << p << std::endl;
}
va_end(vars);
}
foo(1, s, my);
'सहज' उत्पादन 'अहा "में यह स्निपेट का परिणाम है। लेकिन मैं एक सुराग कि यह कैसे काम कर सकते हैं नहीं मिला है:
- अगर variadic-समारोह कॉल तर्कों के संकेत दिए गए धकेलने में अनुवादित किया गया printf एक
CStringA*
कि एकconst char*
- अगर के रूप में व्याख्या की है प्राप्त होगा वैरिएडिक-फ़ंक्शन कॉल
operator (const char*)
पर कॉल कर रहा है, यह मेरी अपनी कक्षा के लिए ऐसा क्यों नहीं करेगा?
क्या कोई इसे समझा सकता है?
संपादित करें: एक डमी वैरैडिक फ़ंक्शन जोड़ा गया है जो इसके तर्कों को const char*
एस के रूप में मानता है। देखें - यह my
तर्क तक पहुंचने पर भी दुर्घटनाग्रस्त हो जाता है ...
प्रिंटफ और सी ++, टट टट –
@ डेविड हेफ़ेमन: मुझे पता है। 'printf' मेरा प्रोटोटाइप वैरैडिक फ़ंक्शन है। वास्तविक कोड जो मैं संदर्भित करता हूं वह एक 'सीएसटींग :: प्रारूप' है। – xtofl
यह क्या मंच है? विजुअल स्टूडियो कोई रूपांतरण नहीं करता है, यह सिर्फ स्टैक पर पूरे मान को धक्का देता है। जीसीसी एक जोर देते हैं। मुझे लगता है कि आप बस "भाग्यशाली" हैं सीएसटींग का पहला सदस्य डेटा के लिए एक सूचक है। – Suma