在类 C 语言(C、C++、Objective-C 等)中,您不能直接传递可变参数。但是,您可以(如果您正在开发一个外部库,或者您只是想促进逆向工程师的工作,您应该)提供您的函数的非可变参数版本,并使可变参数版本只是包装它,这样您可以根据需要将尽可能多的参数传递给您的函数——使用va_list
. 例子:
// variadic function
void variadic_func(int nargs, ...)
{
// just wrap the non-variadic one
va_list args;
va_start(args, nargs);
non_variadic_func(nargs, args);
va_end(args);
}
// non-variadic function
void non_variadic_func(int nargs, va_list args)
{
// do what you want with `args'
}
// you can pass down varargs like this:
void outmost_caller_func(int nargs, ...)
{
// since you can't pass down the `...', you create a va_list argument list
va_list args;
va_start(args, nargs);
// and call the non-variadic version of your function, just like the wrapper
// would do (anyway, the wrapper is only for convenience...)
non_variadic_func(nargs, args);
va_end(args);
}