加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 重用va_list

发布时间:2020-12-16 05:44:07 所属栏目:百科 来源:网络整理
导读:我需要通过va_list进行两次(或更多次)传递.我有一个大小的缓冲区,我想用sprintf写一个格式化的字符串.如果格式化的字符串不适合分配的空间,我想要将分配的空间加倍并重复直到它适合. (作为旁注,我希望能够首先计算格式化字符串的长度并分配足够的空间,但我发
我需要通过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,看看我是否可以考虑真正的声明来破解.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读