gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:22:33 25 4
gpt4 key购买 nike

我已经使用可变参数函数来包装 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() 函数族接口(interface)(包装器)的通用模式。

关于c - Variadic 函数没有正确传递第一个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55642855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com