printf和vprintf函数族之间有什么区别,我应该什么时候使用它们?

我知道printffprintfsprintf等函数和vprintfvfprintfvsprintf等函数的不同之处在于它们如何处理函数参数。 但具体如何? 真的有什么理由使用一个吗? 我是否应该总是使用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()打印输出。