printf和vprintf函数族之间有什么区别,我应该什么时候使用它们?
我知道printf
, fprintf
, sprintf
等函数和vprintf
, vfprintf
, vsprintf
等函数的不同之处在于它们如何处理函数参数。 但具体如何? 真的有什么理由使用一个吗? 我是否应该总是使用printf
,因为在C中vprintf
更常见,或者有理由selectvprintf
吗?
printf()
和朋友正常使用。 当你想写自己的printf()
函数的时候, vprintf()
和好友都是。 假设你想写一个函数来打印错误:
int error(char *fmt, ...) { int result; va_list args; va_start(args, fmt); // what here? va_end(args); return result; }
你会注意到你不能将args
传递给printf()
,因为printf()
需要很多参数,而不是一个va_list
参数。 然而, vprintf()
函数确实需要一个va_list
参数,而不是可变数量的参数,所以这里是完整的版本:
int error(char *fmt, ...) { int result; va_list args; va_start(args, fmt); fputs("Error: ", stderr); result = vfprintf(stderr, fmt, args); va_end(args); return result; }
你永远不想直接使用vprintf()
,但是当你需要换行printf()
时,它是非常方便的。 对于这些情况,您将使用可变参数(…)定义顶级函数。 然后,你将收集到一个va_list
,做你的处理,最后调用va_list
vprintf()
打印输出。