我使用了可变函数来包装printf
(或vprintf
)。
下面的代码可以正常工作,除了在warning_printf
的第一个变量参数上出错。此外,直接放置字符串将更改ASCII字符,但不会修复它,因为消息仍然是随机的。
它打印的内容是
[Warning]
®¯$ address: 0x87afae8a
而不是
[Warning] Failed to initialize setting address: 0x87afae8a
Warning一词的颜色正确(不管怎样,这都无关紧要)。但是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
发布于 2019-04-12 08:45:38
您需要将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()
系列函数的接口(包装器)的一般模式。
https://stackoverflow.com/questions/55642855
复制相似问题