मेरे पास कोड का यह टुकड़ा है (संक्षेप में) ...संदर्भ पैरामीटर के साथ varargs का उपयोग कर gotchas हैं
AnsiString working(AnsiString format,...)
{
va_list argptr;
AnsiString buff;
va_start(argptr, format);
buff.vprintf(format.c_str(), argptr);
va_end(argptr);
return buff;
}
और, संदर्भ के अनुसार पास होने के आधार पर जहां संभव हो, मैंने इसे बदल दिया।
AnsiString broken(const AnsiString &format,...)
{
... the rest, totally identical ...
}
मेरा कॉलिंग कोड इस तरह है: -
AnsiString s1, s2;
s1 = working("Hello %s", "World");
s2 = broken("Hello %s", "World");
लेकिन, एस 1 में "हैलो वर्ल्ड" है, जबकि एस 2 में "हैलो (शून्य)" है। मुझे लगता है कि यह va_start काम करता है, लेकिन मुझे बिल्कुल यकीन नहीं है कि क्या हो रहा है।
क्या हो रहा है की अच्छी व्याख्या। –
यह प्रोवर्बियल लीकी अबास्ट्रक्शन का एक अच्छा उदाहरण है। va_start कुछ प्रकार के जादू की तरह लगता है, लेकिन वास्तव में यह संकलक-अनुमोदित हैकर का थोड़ा सा है। – Eclipse