1

va_listを別の関数に渡したい。これが私がやろうとしていることの例です:

void my_printf_1(char* string, ...) {
    va_list ap;
    va_start(ap, string);
    printf(string, ap);
    va_end(ap);
}

void my_printf_2(char* string, ...) {
    va_list ap;
    va_start(ap, string);
    printf(string, *ap);
    va_end(ap);
}

int main(void) {
    my_printf_1("Hello %i\n", 12); //Shows me the pointer
    my_printf_1("Hello \n"); //Runtime Error - too many arguments
    my_printf_2("Hello %i\n", 12); //Displays correctly because 12 < char
    my_printf_2("Hello %i\n", 500); //Displays incorrectly  because 500 > char
    my_printf_2("Hello %i %i\n", 12, 12); //Displays 12, then crashes Runtime Error not enough arguments
    my_printf_2("Hello \n"); //Runtime Error - too Many Arguments
}

va_list apcharポインタのようですが、どうすればリスト全体を取得できますか?サブファンクションmy_printf()に全体または偽物を渡すように書き直すにはどうすればよいですか?ポインタva_listを受け入れるようにサブ関数を変更できないため、を変更する必要があります。va_listmy_printf

編集:私は次のことがうまくいくことを理解していますが、これは私が望むものではありません。

void my_printf_1(char* string, ...) {
    va_list ap;
    va_start (ap, string);
    vprintf(string, ap);
    va_end(ap);
}
4

2 に答える 2

6

あなたはあなたが言うことをする必要がありますが、明示的です。つまり、実際のva_listオブジェクトを渡します。

vsnprintf()インスピレーションについては、関数を参照してください。標準ライブラリでは、明示的な引数をとる関数にva_listは、多くの場合、先頭に a が付きます。v

にはva_list操作できる内部構造がなく、不透明です。できることはすべて<stdarg.h>ヘッダーで定義されています。

于 2011-04-28T12:17:53.780 に答える
1

vprintf とその仲間をチェックしてください。http://www.manpagez.com/man/3/vprintf/

于 2011-04-28T12:19:09.697 に答える