美文网首页
C语言变参函数的使用

C语言变参函数的使用

作者: CodingCode | 来源:发表于2024-06-25 03:11 被阅读0次
    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()

    相关文章

      网友评论

          本文标题:C语言变参函数的使用

          本文链接:https://www.haomeiwen.com/subject/lrwdcjtx.html