使用带有可变参数字符串的函数

时间:2010-06-06 05:58:50

标签: c++ string vector variadic-functions

我正在玩带有变量参数的函数,并决定创建一个函数来创建带参数的向量。我创建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 个答案:

答案 0 :(得分:4)

尝试将字符串作为varaidic参数传递给出了未定义的行为:“如果参数具有非POD类类型(第9节),则行为未定义。” (§5.2.2/ 7标准)。

答案 1 :(得分:1)

不应在C ++中使用变量参数函数。

第一个参数是它们只对像int或char *这样的POD是安全的,传递非POD C ++类型具有未定义的行为。

为什么不创建一个向量并将字符串推回到它中,而不是创建一个包含长参数列表的函数?

答案 2 :(得分:0)

我不确定,但我会调查va_*是宏的事实,int是“原始”类型而string不是。也许这会在某处导致问题。

编辑:g ++给出了一个重要的警告:不能通过'...'接收非POD类型'struct std :: string'的对象; call将在运行时中止