vprintf是如何实现的?

时间:2014-11-13 21:09:11

标签: c variadic-functions

如果想要在C中编写一个将变量参数列表传递给printf的函数,则必须使用vprintf版本。如何为自定义函数实现此机制?

换句话说,在标准符合C中实现vprintfprintf的区别是什么的本质是什么?

3 个答案:

答案 0 :(得分:6)

如果你想编写一个以va_list作为参数的函数,vprintf的方式,那么你就是这样做的。您可以正常方式从va_list va_arg中提取参数。

请勿在{{1​​}}上致电va_startva_end:这是来电者的责任。由于您无法以正常方式重新启动va_list,如果您需要多次扫描,则需要va_list

这是一个简单的例子,仅用于说明(即它并不意味着最好的实现)。

这两个函数只是使用提供的分隔符字符串连接一堆字符串。第一个是“v”版本(如vsprintf),它实现了逻辑。第二个是varargs版本,它打包va_list并将其传递给实现。

内部函数遍历参数两次;第一次添加字符串的大小。这两个函数都返回一个新的malloc字符串,需要被调用者释放。

参数列表必须以va_copy终止。

NULL

答案 1 :(得分:1)

当然,最大的区别在于printf在格式字符串后面接受可变数量的可选参数,而vprintf接受一个非可选参数" points&#34 ;所有论点。

printf的大部分实施都会创建此单一数据结构,然后调用vprintf

阅读有关变量数量的参数(也称为可变参数)的任何教程,以了解它是如何工作的。 This printf (and family) reference也可以派上用场,this variable arguments reference(有一个例子)。

答案 2 :(得分:1)

诀窍是要意识到vprintf(或者更可能是vfprintf)是实现的基础核心功能。 printf可能只是一个调用va_startvprintf,然后调用va_end的包装器。