c++无限参数数组

C++ unlimited parameters to array

本文关键字:数组 参数 无限 c++      更新时间:2023-10-16

我有一个函数,签名如下

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

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

如有任何帮助,不胜感激。

注:如果需要的话,我正在使用MinGW。


我的问题引起了混乱。我将尽力澄清(对不起我的语法)。Object Pascal和c#都能够向一个方法传递无限数量的参数。在c#中,我们通过params关键字: 来实现这一点
void Foo(params string[] strs)
{
...
}
Foo("first", "second", "another one", "etc");

我想在c++中实现相同的结果,而不使用任何对象/类。在我的情况下,类型安全不是一个问题,但如果有一种类型安全的方式来实现这一目标,我将很高兴听到你的评论:)

谢谢

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

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

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

顺便说一下,我发现对于c++,我通常可以避免变进函数。这样做的好处是可以保持类型安全。你确定你真的需要一个可变函数吗?

使用可变函数参数是一件危险而棘手的事情,几乎可以肯定有更好的方法—例如,您可以将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
  }
  /* ... */
}

您试图完成的一个很好的例子是exec函数族。Exec()接受一个变量参数列表,所有参数都应该是const char*。最后一项是NULL ((char*)0)。最后一项是项目列表何时完成的指示器。

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