c – 重用va_list

前端之家收集整理的这篇文章主要介绍了c – 重用va_list前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要通过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,看看我是否可以考虑真正的声明来破解.

猜你在找的C&C++相关文章