[英]Forward Variadic Argument List to ncurses printw function in c
有人以几种不同的口味要求了这一点。 但是我仍然无法使它正常工作。 这是我的函数定义。
void
ncurses_add_line(const char *fmt, ...)
{
if (ncurses_window) {
va_list args;
va_start(args, fmt);
printw(fmt, args);
printw("\n");
va_end(args);
}
}
当我调用此函数时,我的函数在可变参数打印中变得乱码。 如果我直接给printw
打电话,那一切正常。 例如,如果我像ncurses_add_line("Hello %d", var)
一样调用ncurses_add_line
,则会得到一个不存储在var中的值。 但是,如果我调用printw("Hello %d", var)
,则看到var的值显示在“ Hello”旁边,如var == 1,则将printw
打印“ Hello 1”,但这不是ncurses_add_line
。
我需要更改什么?
我总结一下的原因是因为我不想包含在头文件中,而只包含在c文件中。
尝试使用vwprintw
而不是printw
。 vwprintw将va_list作为其参数。
您尝试使用的惯用法-将va_list传递给带有可变数量参数的函数-将不起作用。 一种解决方案是找到可以使用的功能的变体(在本例中为vwprintw)。 另一种方法是“压平” va_list:在这种情况下,可以使用vsprintf创建格式化的字符串,然后将其传递给curses。
args
不同于参数数组。 这是一个内部结构。 您必须通过传递类型来读出每个参数。 请记住,在C语言中没有运行时反射,因此您必须在代码中添加类型。
void ncurses_add_line(const char *fmt, ...)
{
if (ncurses_window)
{
va_list args;
va_start(args, fmt);
char *arg = va_arg( args, int ); // take out one arg by giving the type (int)
printw(fmt, arg);
printw("\n");
va_end(args);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.