C ++无限参数到数组

时间:2011-07-31 20:36:30

标签: c++

我有一个带有以下签名的功能

char requestApiCall(int num, const wchar_t* pParams = 0, ...)
{
...
}

现在我想将所有pParams放在一个数组中(或者能够迭代它)。我知道这可能是一些宏,但我不知道如何做到这一点。

任何帮助都将不胜感激。

P.S。如果重要的话,我正在使用MinGW。

更新


我的问题引起了混乱。我会尽力澄清(对不起我的语法)。 Object Pascal和C#都能够将无限量的参数传递给方法。在C#中,我们使用params关键字来实现这一点:

void Foo(params string[] strs)
{
...
}
Foo("first", "second", "another one", "etc");

我希望在不使用任何对象/类的情况下在C ++中实现相同的结果。在我的情况下,类型安全不是一个问题,但如果有一种类型安全的方法来实现这一目标,我会很乐意听到你的意见:))

由于

3 个答案:

答案 0 :(得分:4)

您需要查看stdarg.h中声明的函数和宏。这是一个解释它的教程。

http://publications.gbdirect.co.uk/c_book/chapter9/stdarg.html

我不确定你的函数参数应该代表什么,但我认为你会发现它需要改变。

顺便说一下,我发现对于C ++我通常可以避免使用可变函数。这具有保持类型安全性的优点。你确定你真的需要一个可变函数吗?

答案 1 :(得分:2)

使用可变参数函数参数是一项危险且棘手的业务,几乎可以肯定有更好的方法 - 例如,您可以将std::vector<std::wstring>&传递给您的函数!

好的,那说,这是如何使用可变参数。关键点在于您有责任了解参数的数量和类型

#include <cstdarg>

char requestApiCall(int num, const wchar_t* pParams, ...)
{
   va_list ap;             // the argument pointer
   va_start(ap, pParams);  // initialize it with the right-most named parameter

   /** Perform magic -- YOU have to know how many arguments you are getting! **/

   int a = va_arg(ap, int);      // extract one int
   double d = va_arg(ap, double) // one double
   char * s = va_arg(ap, char*)  // one char*
   /* ... and so forth ... */

   va_end(ap);             // all done, clean up
}

为了完整起见,我将重新定义函数:

char requestApiCall(std::vector<std::wstring> & params)
{
  for (std::vector<std::wstring>::const_iterator it = params.begin(), end = params.end(); it != end; ++it)
  {
    // do something with *it
  }
  /* ... */
}

答案 2 :(得分:0)

您要完成的一个很好的例子是exec系列函数。 exec()接受一个变量参数列表,所有这些参数都应该是const char *。最后一项是NULL((char *)0)。最后一项是项目清单何时完成的指标。

您可以像其他人描述的那样在stdargs.h中使用可变参数宏。