我需要对va_list
进行两次(或更多次)传递。我有一些大小的缓冲区,我想用sprintf写入格式化的字符串。如果格式化的字符串不适合分配的空间,我想将分配的空间加倍,然后重复直到适合为止。
(作为一个旁注,我希望能够首先计算格式化字符串的长度并分配足够的空间,但是我发现可以做到这一点的唯一功能是_snprintf,而在VS2005中已弃用了此功能...)
现在,到目前为止没有问题:我使用vsnprintf
并在每次调用前调用va_start
。
但是我还创建了一个函数,该函数将va_list
作为参数,而不是“...”。那我就不能再使用va_start
了!我已经阅读了va_copy
,但是VS2005不支持它。
那么,您将如何做呢?
最佳答案
我看不到任何可移植的方法(我认为va_copy已在C99中引入,因为在c89中没有可移植的方法来实现其结果)。 va_list可以是模拟为声明为的引用类型
typedef struct __va_list va_list[1];
(有关该技巧的另一个用户,请参见gmp),这说明了围绕它们的许多语言限制。顺便说一句,如果可移植性很重要,请不要忘记va_end。
如果可移植性不重要,我将检查stdard.h并考虑真正的声明是否可以破解某些东西。