пересылка параметров из функции с переменными параметрами в функцию с фиксированным аргументом - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть функция, которая принимает переменное количество аргументов. Из этой функции я хочу вызывать функции, которые принимают фиксированное количество аргументов,

void log(int level, const char* format, ...)
{
    va_list args;
    va_start(args, fmt);

    int count = 0;
    void *navigator[10] = NULL;

    while ((navigator[count] = va_arg(args, char*) ) != NULL && count < 10) 
        ++count;   //Is this the right way to count no. of arguments passed ?


    fprintf(stderr, "**** No of arguments : %d\n", count);
    fflush(stderr);

    switch (count - 2)
    {
    case 0:
                log_l(level, fmt);
        break;
    case 1:
           log_l1(level, fmt, navigator[0]);  // how would I get arg1 here, 
                                              // I get NULL in the called function)*/
        break;
         .
         .
         .
         .
         .

    };
}

Я хочу знать правильный способ подсчета количества переданных параметров, а затем правильно передать их другим функциям с фиксированными параметрами.

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

Ваш va_start должен быть va_start(args, format); // Note change to "format".

РЕДАКТИРОВАТЬ: Даже с этим в соответствии с manpage из va_arg вы не можете делать то, что вы хотите.

Если фактического следующего аргумента нет или iftype не совместим с типом фактического следующего аргумента (как продвигается в соответствии с предложениями аргументов по умолчанию), поведение не определено.

Ноэто помечено C ++, так почему бы не использовать идиому C ++: использовать потоки и вставку operator<< вместо использования varargs вообще.

1 голос
/ 06 апреля 2011

Нет способа - вам нужно передать эту информацию явно, например, с параметром count или явным 0 в качестве последнего параметра. Информация о типе также не передается ни в какой форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...