我有一个带有以下签名的功能
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 ++中实现相同的结果。在我的情况下,类型安全不是一个问题,但如果有一种类型安全的方法来实现这一目标,我会很乐意听到你的意见:))
由于
答案 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中使用可变参数宏。