2016-11-19 13 views
0

これはいくつかの異なる味で尋ねられました。しかし、私はまだそれを働かせることはできません。ここに私の関数定義があります。ncursesへのフォワードVariadic引数リスト

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を呼び出すと、値はvarに格納されません。しかし、私がprintw("Hello %d", var)を呼び出すと、varの値が "Hello"の隣に表示され、var == 1なら "Hello 1"がprintwと表示されますが、これはncurses_add_lineの場合には当てはまりません。

変更する必要があるのは何ですか?

これをラップする理由は、私のヘッダーファイルに、私のcファイルだけを含めたくないからです。

答えて

2

printwの代わりにvwprintwを試してください。​​は引数としてva_listをとります。

可変長の引数を取る関数にva_listを渡して使用しようとしているイディオムは機能しません。 1つの解決策は、動作する関数の変種(この場合はvwprintw)を見つけることです。代わりに、va_listを "平坦化"することができます。この場合、vsprintfを使用して書式設定された文字列を作成し、それをcursesに渡すことができます。

1

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);                
    }                    
} 
関連する問題