【C/C++】 可变参数函数

发布时间 2023-04-24 16:27:47作者: 壹点灵异
#include <stdio.h>
#include <stdarg.h>

/**
 * 按自定义格式符解析数据
 */
void process(const char *fmt, va_list args)
{
    for (; *fmt; fmt++) {
        if (*fmt == '%') {
            continue;
        }

        switch (*fmt) {
            case 'a': {
                char *str = va_arg(args, char *);
                printf("%s\n", str);
                continue;
            }
            case 'b': {
                float *num = va_arg(args, float *);
                printf("%f\n", *num);
                continue;
            }
            case 'f': {
                float num = va_arg(args, double);  // 解析浮点数须用double,不能用float
                printf("%f\n", num);
                continue;
            }
            default:continue;
        }
    }
}

/**
 * 自定义可变参数函数
 * @param  hint: 传递给函数的额外参数
 * @param  fmt:  自定义格式符
 */
void VariadicFunction(char *hint, const char *fmt, ...)
{
    // 定义有个参数列表
    va_list args;
    // 初始化列表参数args,第二个参数可变参数前的第一个固定参数,即略号前的第一个参数
    va_start(args, fmt);
    // 解析数据
    process(fmt, args);
    // 释放可变参数列表
    va_end(args);
    // 额外参数处理
    printf("hint: %s\n", hint);
}

int main() 
{
    float f = 6.66;
    VariadicFunction("Here's a hint!", "%a%b%f%a", "string1", &f, 9.99, "STRING2");
    return 0;
}