簡體   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