2013-04-10 2 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");

Моя цель: чтобы напечатать информацию, в списке of fd's ..

Спасибо

+0

Вы можете передать список fd как набор какого-либо рода (массив, список, набор, ...) –

+0

Почему тег C, когда это вопрос на C++? Обратите внимание, что использование контейнеров намного превосходит va_lists. –

+0

Как вы это себе представляете? –

ответ

4

Вы не можете сделать это напрямую. Что вы можете сделать, хотя,

void printFDS(int num_fds, ...) 

и в функции, используйте va_copy, чтобы получить две va_list переменные. В одном, прочитайте FILE * s. В другой, сначала пропустите num_fdsFILE * s, затем используйте va_arg, чтобы получить строку формата.

Вам нужно будет сделать еще несколько копий, чтобы гарантировать, что эта секунда va_list не будет разбита на vfprintf, вы можете снова использовать va_copy.

5

Это невозможно, многоточие (три точки) должно быть только один раз и только последним.


Если у вас есть C++ 11, способный компилятору, вы могли бы быть в состоянии сделать это с initializer list и std::vector для первого аргумента:

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

Вы можете Кэл как

printFDS({ stderr, otherFilePointer }, "Error: %s\n", std::strerror(errno)); 
Смежные вопросы