сбой функции varargs - PullRequest
       2

сбой функции varargs

1 голос
/ 06 августа 2010

У меня есть функция, которая должна принимать переменное количество аргументов (используя varargs) на основе строки формата:

void va(const char* name, const char* argformat, ...) {
    int numOfArgs = strlen(argformat);

    std::string buf = "asdf";

    va_list listPointer;
    va_start(listPointer, numOfArgs);
    char* blah;

    for(int i = 0; i < numOfArgs; i++) {
            switch (argformat[i]) {
                    case 's':
                            cout << va_arg(listPointer, char*) << endl;
                            break;
                    case 'i':
                            cout << va_arg(listPointer, int) << endl;
                            break;
                    case 'f':
                            cout << va_arg(listPointer, float) << endl;
                            break;
                    case 'b':
                            cout << va_arg(listPointer, bool) << endl;
                            break;
                    default:
                            break;
            }
    }

    va_end(listPointer);

    return;
}


int main() {
    va("fe", "sb", "asdf", true);

    return 0;
}

Вылетает.

Если я изменюсь
cout << va_arg (listPointer, char *) << endl; <br> до
cout << va_arg (listPointer, char) << end; </p>

печатает "а".

Что я делаю не так?

1 Ответ

6 голосов
/ 06 августа 2010

Должно быть va_start(listPointer, argformat). va_start принимает последний названный параметр в качестве второго аргумента. (Это технически означает, что вам вообще не нужно предварительно вычислять длину строки аргумента & mdash; просто перебирайте символы (перебирая varargs по мере работы), пока не дойдете до конца строки.)

...