C语言变参函数的使用

2024-06-25  本文已影响0人  CodingCode
  1. 定义变参函数
#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);
}
  1. 如何调用变参函数
int main() {
  log("int = $d", 10);
  log("str=%d", "abcd");
  return 0;
}
  1. 变参函数调用另一个变参函数

例如,我们定义一个上层函数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);
    }
}

所以:

  1. 定义个内部实现函数_log(const char *, va_list)
    在这个函数使用va_list作为参数,所以在函数内就不再使用va_start()va_end()
  2. 外部函数log()logv()都调用内部函数_log()
上一篇下一篇

猜你喜欢

热点阅读