Variadic 函数没有正确传递第一个参数

Variadic function does not pass the first argument correctly

我已经使用可变函数来包装 printf(或 vprintf)。

除了 warning_printf 的第一个可变参数出错外,以下代码有效。此外,直接放置字符串会更改 ASCII 字符,但不会修复它,因为消息仍然是随机的。

它打印出来的是

[Warning]
          ®¯$ address: 0x87afae8a

而不是

[Warning] Failed to initialize setting address: 0x87afae8a

警告一词的颜色正确(无论如何都没有关系)。但是 msg_warn 似乎没有被正确传递。我测试了向这个函数添加更多变量。它们都工作正常,除了第一个可变参数 msg_warn.

我的代码有什么问题?

void colorful_printf( const char* header, const char* color, const char* fmt, ... )
{
    printf("[%s%s%s] ", color, header, RESET_ANSI_COLOR);
    va_list args;
    va_start( args, fmt );
    vprintf(fmt, args);
    va_end( args );
}


void warning_printf( const char* fmt, ... )
{
    va_list args;
    va_start( args, fmt );
    colorful_printf("Warning", WARNING_COLOR, fmt, args);
    va_end( args );
}


char msg_warn[] = "Failed to initialize setting";
warning_printf( "%s address: 0x%2x", msg_warn, address );

在线编译器:link

您需要将 va_list 传递给需要它们的函数 — 类似于 v*printf() 函数。

void colorful_vprintf(const char* header, const char* color, const char* fmt, va_list args)
{
    printf("[%s%s%s] ", color, header, RESET_ANSI_COLOR);
    vprintf(fmt, args);
}

void colorful_printf(const char* header, const char* color, const char* fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    colorful_vprintf(header, color, fmt, args);
    va_end(args);
}

void warning_vprintf(const char* fmt, va_list args)
{
    colorful_vprintf("Warning", WARNING_COLOR, fmt, args);
}

void warning_printf(const char* fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    warning_vprintf(fmt, args);
    va_end(args);
}

*_vprintf 函数完成真正的工作;带有省略号的函数只是获取参数的 va_list 并将它们传递给 *_vprintf() 函数。 这是 printf() 函数族接口(包装器)的通用模式。