В 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);
}
Я не знаю, что здесь означает «выдержка». Вроде, вообще. – djechlin
@djechlin: Я собираюсь угадать, это ссылка на рефакторинг в стиле Eclipse. –
это может помочь: http://en.wikipedia.org/wiki/Code_refactoring –