2

stdarg.hライブラリを使用して、引数の数が不明な関数を使用することを学びました。これを使用する簡単な関数を次に示します。

void print(int args,...){
    va_list ap;
    va_start(ap, args);
    int i = 0;
    for(i=0; i<args; i++){
        printf("%d\n",va_arg(ap, int));
    }
    va_end(ap);
}

printf 上記のコードに基づいて、どうすれば克服できるかわからない主な制約が 2 つあります。

1) 固定数の引数: つまり、ほぼ vardiac 関数では、引数の数を含める必要があります。しかし、私が書くときprintf、私はこの番号を含める必要はありません. printf実際に引数を使用する前に、以前に引数の数を数えたと思いました(最初の文字列の数%を数えることによって)。しかし、繰り返しになりますが、このソリューションは少し効率的ではないと思います。引数の数を数え、この引数をスタックに入れ、最後にすべてを画面に入れます。

2) すべての引数は同じ型でなければなりません: 次の行にあるように: printf("%d\n",va_arg(ap, int));. したがって、リスト内のすべての引数は同じ型でなければなりません。ご存知のように、これは printf では必須ではありません。整数または文字列と一緒に double を出力できます。これらすべてを文字列のように扱うと、構文が間違っているため、この行はエラーになるはずです。

printf("%d",4); //4 cannot treat by string
printf("%d",'4'); // :)) I think this line is better

上記の2つの問題を説明してください。

4

1 に答える 1

9

1) 自分で質問に答えました -printfフォーマット文字列を解析して、va_list で受け取る引数の数を決定する必要があります。

2) フォーマット リストを解析するとき、フォーマット リストで指定された引数の型を追跡var_argし、適切な型で呼び出します。

また、参照してください-興味深いものは にvfprintf()あります。リンクされたソースは次のとおりですが、より読みやすい(効率が悪い場合)バージョンがある可能性があります。

編集: snprintf hereの移植可能な実装があり、より読みやすいように見えます (ここ で snprintf() の C ソース コードを探しています) 。

于 2012-08-12T10:07:23.793 に答える