gcc创建c语言项目,c – 如何在GCC上创建va_list?

博客探讨了C语言中变长参数列表(va_list)的工作原理,尤其是关于是否需要创建新的va_list对象的问题。文章指出,vsnprintf函数可以使用现有的va_list,但提取参数后可能需要深拷贝以保留剩余参数。va_copy宏被提及作为可能的解决方案,同时提到了如何在不支持va_copy的情况下处理参数。文章强调了正确管理和使用va_list在C编程中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有点迷茫.为什么需要一个新的动态生成的va_list?为什么不重用旧的呢?

我相信vsnprintf()使用当前的va_list对象(如果你可以调用它).所以你可以自由地使用va_start(),通过va_arg()使用你想要的参数,然后通过va_list将剩下的参数传递给vsnprintf(),然后调用va_end().

我错过了什么吗?为什么深拷贝?

如果你确实需要深层复制,为什么不刷新va_start(),通过va_arg()删除你想要的参数,然后将生成的va_list对象传递给vsnprintf().

(每次调用va_arg都会修改va_list对象,以便下一个调用返回下一个参数.)

或者,您可以使用va_copy(). (尽管一定要用相应的va_end()跟随它.)

附录:另请注意,这些va_宏基于C89& C99标准. GNU g将支持它们.微软有点受限.

跟进TonyK的评论:

如果您从va_list中删除前N个项目,我上面所说的就可以了.如果你从中间拉出物品,那就更难了.

没有可移植的方法来构造va_list.

但是,您可以拆分格式字符串,使用它来确定对象类型(double,float,int等),并使用它自己的格式字符串(原始格式字符串的子部分)单独打印每个字符串.多个snprintf()调用将导致一些开销.但如果不经常调用这个例程,它应该是可行的.

您还可以使用适当制作的va_list打印出原始格式字符串的子部分.换句话说,第一个vsnprintf()调用打印元素1..3,第二个元素5..7,第三个10..13等等(因为vsnprintf()会忽略va_list上的额外元素超出它的需要你只需要一系列相应的格式字符串片段,并根据每个vsnprintf()调用的需要用va_arg()弹出va_list中的项目.)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值