A previous question एक स्ट्रिंग को प्रिंट करने का एक अच्छा तरीका दिखाया गया है। जवाब शामिल va_copy:va_copy - दृश्य सी ++ को पोर्टिंग?
std::string format (const char *fmt, ...);
{
va_list ap;
va_start (ap, fmt);
std::string buf = vformat (fmt, ap);
va_end (ap);
return buf;
}
std::string vformat (const char *fmt, va_list ap)
{
// Allocate a buffer on the stack that's big enough for us almost
// all the time.
s ize_t size = 1024;
char buf[size];
// Try to vsnprintf into our buffer.
va_list apcopy;
va_copy (apcopy, ap);
int needed = vsnprintf (&buf[0], size, fmt, ap);
if (needed <= size) {
// It fit fine the first time, we're done.
return std::string (&buf[0]);
} else {
// vsnprintf reported that it wanted to write more characters
// than we allotted. So do a malloc of the right size and try again.
// This doesn't happen very often if we chose our initial size
// well.
std::vector <char> buf;
size = needed;
buf.resize (size);
needed = vsnprintf (&buf[0], size, fmt, apcopy);
return std::string (&buf[0]);
}
}
समस्या मैं आ रही है कि इसके बाद के संस्करण कोड विज़ुअल सी के बंदरगाह नहीं है ++ है क्योंकि यह va_copy (या यहां तक __va_copy) प्रदान नहीं करता है। तो, क्या किसी को पता है कि उपरोक्त कोड को सुरक्षित रूप से कैसे बंद किया जाए? संभवतः, मुझे va_copy प्रतिलिपि करने की आवश्यकता है क्योंकि बनामप्रिंटफ उत्तीर्ण रूप से उत्तीर्ण va_list को संशोधित करता है।
मैंने वीसी ++ में समान चीजों को लागू किया है और कभी भी 'va_copy() 'का उपयोग करने की आवश्यकता नहीं है। जब आप कॉपी का उपयोग किये बिना कोशिश करते हैं तो क्या होता है? –
कौन जानता है ... यह काम पर दिखाई दे सकता है। यहां तक कि अगर ऐसा होता है, तो इसका मतलब यह सुरक्षित नहीं है। – user48956
स्पष्ट रूप से va_copy() एक सी 99 चीज है। वीसी ++ के लिए, आप एक प्रतिलिपि के बारे में चिंता किए बिना मूल va_list का उपयोग करके ठीक से ठीक होंगे। बनामप्रिंटफ पास की गई सूची को संशोधित करने की कोशिश नहीं करेगा। –