我需要对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并考虑真正的声明是否可以破解某些东西。

10-06 15:24