переменное число аргументов си++ = ПЕРЕМЕННОЕ число аргументов функции си++

хорошая статья на тему - http://www.rsdn.ru/forum/cpp/418970.1.aspx

Краткий конспект:

Список параметров совсем пустой быть не может, должен быть прописан хотя бы один явный параметр, адрес которого мы можем получить при выполнении программы. Заголовок такой функции может выглядеть так:

int f(int k...);

Ни запятая, ни пробел после параметра не обязательны, хотя можно их и прописать.

Попробуем написать функцию, вычисляющую среднее арифметическое своих аргументов. Для этого требуется решить несколько проблем

  1. как установиться на список параметров в стеке;
  2. как «перебирать» параметры;
  3. как закончить перебор

Для доступа к списку параметров нам потребуется указатель, значением которого будет адрес последнего явного параметра в списке.
Ответ на второй вопрос очевиден – надо изменять значение этого указателя, чтобы переместиться на следующий параметр. Отсюда следует, что указатель должен быть типизированным, поскольку с бестиповым указателем нельзя выполнять арифметические операции.

Это же означает, что программист при разработке функции с переменным числом параметров должен отчетливо себе представлять типы аргументов, которые будет обрабатывать функция. Кроме того, способ передачи параметров должен быть одинаковым для всех параметров:

  1. либо все – по значению
  2. либо все – по ссылке
  3. либо все – по указателю

Ответ на последний вопрос не вызывает затруднений - это можно сделать одним из двух способов:

  1. явно передать среди обязательных параметров количество аргументов;
  2. добавить в конец списка аргумент с уникальным значением, по которому будет определяться конец списка параметров;

И тот, и другой способ имеют право на жизнь — все определяется потребностями задачи и вкусами программиста. В данном случае сначала попробуем второй способ: последним значением списка параметров будет ноль (листинг 7.7).

Листинг 7.7. Вычисление среднего арифметического аргументов (ноль в конце)

double f(double n, ...)    //--заголовок с переменным числом параметров
{   double *p = &n;        //--установились на начало списка параметров
    double sum = 0, count = 0;    
    while (*p)         //--пока аргумент не равен нулю
    { sum+=(*p);         //--суммируем аргумент
      p++;             //--«перемещаемся на следующий аргумент
      count++;         //--считаем  количество аргументов
    }
    return ((sum)?sum/count:0);    //--вычисляем среднее
}

Вызов такой функции может выглядеть таким образом:

double y = f(1.0, 2.0, 3.0, 4.0, 0.0);

Если в функцию передаётся переменное число строк , то полезно изучить и этот пример.


ПРИМЕЧАНИЕ = Также можно "перешагивать" и переменное число байт - просто время от времени приводя указатель к нужному типу (фактически - передавать переменное число аргументов разного типа) - как это сделано в следующем примере (реализация fprintf)