我需要对 va_list
进行两次(或多次)传递。我有一个一定大小的缓冲区,我想用 sprintf 向其中写入一个格式化的字符串。如果格式化的字符串不适合分配的空间,我想将分配的空间加倍并重复直到它适合。
(作为旁注,我希望能够首先计算格式化字符串的长度并分配足够的空间,但我发现唯一可以做到这一点的函数是 _snprintf,它在 VS2005 中已被弃用。 ..)
现在,到目前为止没有问题:我使用 vsnprintf
并在每次调用之前调用 va_start
。
但我还创建了一个函数,它采用 va_list
作为参数,而不是“...”。那我就不能再使用 va_start
了!我读过有关 va_copy
的内容,但它在 VS2005 中不受支持。
那么,你会怎么做呢?
最佳答案
A previous question关于 MSVC 中缺少 va_copy
有一些足够不错的建议,包括实现您自己的 va_copy
版本以供在 MSVC 中使用:
#define va_copy(d,s) ((d) = (s))
您可能希望将其放入受 #ifndef va_copy
和 #ifdef _MSC_VER
保护的“可移植性” header 中,以便在 VC 上使用。
关于c - 重用 va_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2288680/