使用带有可变参数字符串的函数
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”的对象;调用将在运行时中止
【讨论】:
以上是关于使用带有可变参数字符串的函数的主要内容,如果未能解决你的问题,请参考以下文章