2013-04-10 67 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)); 
相關問題