如果想要在C中编写一个将变量参数列表传递给printf
的函数,则必须使用vprintf
版本。如何为自定义函数实现此机制?
换句话说,在标准符合C中实现vprintf
与printf
的区别是什么的本质是什么?
答案 0 :(得分:6)
如果你想编写一个以va_list
作为参数的函数,vprintf
的方式,那么你就是这样做的。您可以正常方式从va_list
va_arg
中提取参数。
请勿在{{1}}上致电va_start
或va_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_start
,vprintf
,然后调用va_end
的包装器。