A previous question cho thấy một cách in đẹp đến một chuỗi. Câu trả lời có liên quan va_copy:va_copy - chuyển sang hình ảnh C++?
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]);
}
}
Vấn đề tôi đang gặp là các mã trên không cảng để Visual C++ vì nó không cung cấp va_copy (hoặc thậm chí __va_copy). Vì vậy, không ai biết làm thế nào để an toàn cổng mã trên? Có lẽ, tôi cần phải làm một bản sao va_copy vì vsnprintf phá hủy sửa đổi va_list đã qua.
Tôi đã thực hiện những điều tương tự trong VC++ và không bao giờ cần sử dụng 'va_copy()'. Điều gì sẽ xảy ra khi bạn thử nó mà không cần sử dụng bản sao? –
Ai biết được ... Có vẻ như nó hoạt động. Ngay cả khi nó có, nó không có nghĩa là nó an toàn. – user48956
Rõ ràng va_copy() là một điều C99. Đối với VC++, bạn sẽ chỉ sử dụng va_list gốc nhiều lần mà không phải lo lắng về bản sao. vsnprintf sẽ không cố sửa đổi danh sách được chuyển. –