- 定义变参函数
#include <stdarg.h>
void log(const char *fmt, ...)
{
char buf[1000];
va_list args;
va_start(args, fmt);
vsnprintf(buf, sizeof(buf), fmt, args);
va_end(args);
printf("%s\n", buf);
}
- 如何调用变参函数
int main() {
log("int = $d", 10);
log("str=%d", "abcd");
return 0;
}
- 变参函数调用另一个变参函数
例如,我们定义一个上层函数logv带有一个额外参数级别,只有level大于0时才输出:
void logv(int level, const char *fmt, ...)
{
if (level > 0) {
log(fmt, ...);
}
}
这里应该怎写呢?直接写...
肯定是不行的,不认识,而如果:
void logv(int level, const char *fmt, ...)
{
if (level > 0) {
va_list args;
va_start(args, fmt);
log(fmt, args);
va_end(args);
}
}
看起来好像挺合理的,实际上也是不行的,va_list和...
不是同一种类型。
正确的做法是,必须定义函数使用va_list作为参数:
static void _log(const char *fmt, va_list args)
{
vsnprintf(buf, sizeof(buf), fmt, args);
printf("%s\n", buf);
}
void log(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
_log(fmt, args);
va_end(args);
}
void logv(int level, const char *fmt, ...)
{
if (level > 0) {
va_list args;
va_start(args, fmt);
_log(fmt, args);
va_end(args);
}
}
所以:
- 定义个内部实现函数
_log(const char *, va_list)
。
在这个函数使用va_list作为参数,所以在函数内就不再使用va_start()
和va_end()
。 - 外部函数
log()
和logv()
都调用内部函数_log()
。
网友评论