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

Я немного поигрался с функциями с переменными аргументами и решил создать функцию для создания векторов с аргументами. Моя функция для создания вектора int сработала ...

vector<int> makeIntVector(int numArgs, ...) {
    va_list listPointer;
    va_start(listPointer, numArgs);
    vector<int> made;
    for(int a = 0; a < numArgs; a++)
        made.push_back(va_arg(listPointer, int));
    va_end(listPointer);
    return made;
}

но не моя функция для создания string вектора:

vector<string> makeStringVector(int numArgs, string something, ...) {
    va_list listPointer;
    va_start(listPointer, something);
    vector<string> made;
    for(int a = 0; a < numArgs; a++)
        made.push_back(va_arg(listPointer, string));
    va_end(listPointer);
    return made;
}

, который вылетает из программы. Что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 06 июня 2010

Попытка передать строку в качестве параметра varaidic приводит к неопределенному поведению: «Если аргумент имеет тип класса не POD (пункт 9), поведение не определено». (§5.2.2 / 7 стандарта).

1 голос
/ 06 июня 2010

Переменные аргументы функции не должны использоваться в C ++.

Первый аргумент в том, что они безопасны только для POD, таких как int или char *, передача не-POD типа C ++ имеет неопределенное поведение.

Вместо того, чтобы создавать функцию с длинным списком аргументов, почему бы вам просто не создать вектор и не вставить туда свои строки?

0 голосов
/ 06 июня 2010

Я не уверен, но я бы исследовал тот факт, что va_* - это макросы, в то время как "примитивный" тип, а string - нет. Может быть, это где-то вызывает проблему.

РЕДАКТИРОВАТЬ: g ++ выдает важное предупреждение: не может получать объекты не POD типа ‘struct std :: string’ через ‘...’; вызов будет прерван во время выполнения

...