6

Cプログラムでprintfをラップしようとしています(実際には_snprintfですが、この例はより単純です)、可変引数のものを機能させるのに問題があります。これが私のコードです:

#include <stdio.h>
#include <stdarg.h>

void works(void)
{
    printf("%d\n", 100);
}

void wrap_printf(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    printf(fmt, args);
    va_end(args);
}

void broken(void)
{
    wrap_printf("%d\n", 100);
}

int main(void)
{
    works();
    broken();
    return 0;
}

ここに私の出力があります:

100
3668388

args 変数はva_start、コード内で を呼び出した後は問題ないように見えますが、C ランタイム コードにステップインして値を呼び出すとすぐにva_start、値が悪く見えます。私が間違っているかもしれないことについて何か考えはありますか?

4

2 に答える 2

10
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);

vprintfの代わりに呼び出す必要がありますprintfv*printf関数は引数を理解しますva_List。警告を受けなかったことに驚いています。

于 2012-05-28T15:11:48.650 に答える
5

あなたはargswhichを渡していますva_listprintf()、もちろん引数を直接期待しています.2番目の引数が突然 a であることを知る方法はありませんva_list.

実際に a を期待し、そこから値を抽出する方法を知っているvprintf()可変引数バージョンであるを使用する必要があります。va_list

于 2012-05-28T15:12:32.063 に答える