2

我想在一个函数中使用两次 va_list 方法。我可以这样做吗?

#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

这是不可能的,省略号(三个点)必须只有一次且只有最后一个。


如果你有一个支持 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 回答
4

您不能直接执行此操作。但是,您可以做的是

void printFDS(int num_fds, ...)

并在您的函数中,用于va_copy获取两个va_list变量。在一个中,阅读FILE *s。另一种是先skip num_fds FILE *s,然后用它va_arg来获取格式字符串。

您将需要进行更多复制以确保该秒va_list不会被 垃圾vfprintf,您可以再次使用va_copy它。

于 2013-04-10T10:30:21.040 回答