2013-04-10 66 views
2

我想在一个函数中使用两次va_list方法。我可以这样做吗?是否可以在函数中使用两次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 ..

谢谢

+0

你可以通过fd的列表作为某种类型的集合(数组,列表,集合,...) – 2013-04-10 10:26:35

+0

为什么C标记时这是一个C++问题?并注意使用容器远远胜于va_lists。 – 2013-04-10 10:27:09

+0

你如何设想? – 2013-04-10 10:27:44

回答

4

你不能直接这样做。你能做什么,不过,是

void printFDS(int num_fds, ...) 

,并在你的功能,使用va_copy得到两个va_list变量。其中之一,请阅读FILE *。另一方面,首先跳过num_fdsFILE * s,然后使用va_arg获取格式字符串。

你需要做一些更多的拷贝,以确保该第二va_list不被丢弃vfprintf,您可以再次使用va_copy了点。

5

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


如果你有一个C++ 11能够编译器,你也许可以与第一个参数的initializer liststd::vector做到这一点:

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

你可以CAL它作为

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