是否可以在函数中使用va_list方法两次?

时间:2013-04-10 10:22:59

标签: c++ formatting

我想在一个函数中使用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列表中打印信息..

由于

2 个答案:

答案 0 :(得分:5)

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


如果您有一个支持C ++ 11的编译器,您可以使用initializer liststd::vector作为第一个参数:

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

你可以把它称为

printFDS({ stderr, otherFilePointer }, "Error: %s\n", std::strerror(errno));

答案 1 :(得分:4)

你不能直接这样做。但是你可以做的是

void printFDS(int num_fds, ...)

在您的函数中,使用va_copy获取两个va_list变量。在其中一个,阅读FILE *。在另一方面,首先跳过num_fds FILE *,然后使用va_arg获取格式字符串。

您需要进行更多复制,以确保va_list不会破坏第二个vfprintf,您可以再次使用va_copy