2

1 つの関数で va_list メソッドを 2 回使用したいと考えています。それをしてもいいですか?

#include <cstdarg>

void printFDS(int num_fds, ... , const char *fmt, ...) {

    va_list fds, args;
    va_start(fds, num_fds);
    va_start(args, fmt);

    for (int i = 0; i < num_fds; i++) {
        vsprintf(va_arg(fds, FILE*), fmt, args);
    }
    va_end(args);
    va_end(fds);
}

したがって、その関数を次のように呼び出すことができます。

printFDS(1, stderr, "Error: %s\n", stderror(errno));

また printFDS(2, stderr, otherFD, "Error: %s\n", stderror(errno));

その間FILE *otherFD = fopen ("somefile", "w");

私の目的: fd のリストに情報を出力する..

ありがとう

4

2 に答える 2

5

それは不可能です。省略記号 (3 つのドット) は 1 回だけ最後に使用する必要があります。


C++11 対応のコンパイラがある場合は、初期化子リストstd::vector最初の引数を使用して実行できる場合があります。

void printFDS(const std::vector<FILE*>& files, const char* fmt, ...)
{
    // ...
}

あなたはそれを次のように呼ぶことができます

printFDS({ stderr, otherFilePointer }, "Error: %s\n", std::strerror(errno));
于 2013-04-10T10:24:14.130 に答える