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

Posted

技术标签:

【中文标题】使用带有可变参数字符串的函数【英文标题】:Using a function with variable argument strings 【发布时间】:2010-06-06 05:58:50 【问题描述】:

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

这会使程序崩溃。我做错了什么?

【问题讨论】:

【参考方案1】:

尝试将字符串作为可变参数传递会产生未定义的行为:“如果参数具有非 POD 类类型(第 9 条),则行为未定义。” (标准第 5.2.2/7 节)。

【讨论】:

【参考方案2】:

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

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

与其创建一个包含一长串参数的函数,不如创建一个向量并将字符串推回其中?

【讨论】:

why don't you just create a vector and push back your strings into it 因为它变得非常乏味:P C++11 似乎用它的初始化列表来解决这个问题。万岁!【参考方案3】:

我不确定,但我会调查以下事实:va_* 是宏,是“原始”类型,而 string 不是。也许这会导致某个地方出现问题。

编辑:g++ 给出一个重要警告:无法通过“...”接收非 POD 类型“struct std::string”的对象;调用将在运行时中止

【讨论】:

以上是关于使用带有可变参数字符串的函数的主要内容,如果未能解决你的问题,请参考以下文章

透明地通过带有可变参数列表的函数

如何使用 SWIG 包装带有可变参数的 C 函数

Python新手学习基础之函数-可变参数**

在R中使用带有向量而不是可变数量的参数的sprintf

C语言可变参数

C语言可变参数