繁体   English   中英

转发可变参数列表到ncurses c中的printw函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM