Функции с переменным числом параметров си - три точки - многоточие - вместо параметра функции си

Forums:

http://www.abyss-group.narod.ru/docs/Cpr...

При вызове функции с переменным числом параметров в вызове этой функции задается любое требуемое число аргументов. В объявлении и определении такой функции переменное число аргументов задается многоточием в конце списка формальных параметров или списка типов аргументов.

Примерами функций с переменным числом параметров являются функции из библиотеки функций языка СИ, осуществляющие операции ввода-вывода информации (printf,scanf и т.п.)

Программист может разрабатывать свои функции с переменным числом параметров.

Для обеспечения удобного способа доступа к аргументам функции с переменным числом параметров имеются три макроопределения (макросы)=

  1. va_start
  2. va_arg
  3. va_end

находящиеся в заголовочном файле stdarg.h. Эти макросы указывают на то, что функция, разработанная пользователем, имеет некоторое число обязательных аргументов, за которыми следует переменное число необязательных аргументов. Обязательные аргументы доступны через свои имена как при вызове обычной функции. Для извлечения необязательных аргументов используются макросы va_start, va_arg, va_end в следующем порядке.

1) Макрос va_start - указываем на первый необязательный

Макрос va_start предназначен для установки аргумента arg_ptr на начало списка необязательных параметров и имеет вид функции с двумя параметрами:

void va_start(arg_ptr,prav_param);


Параметр prav_param
должен быть последним обязательным параметром вызываемой функции, а указатель arg_prt должен быть объявлен с предопределением в списке переменных типа va_list в виде:

va_list arg_ptr;

Макрос va_start должен быть использован до первого использования макроса va_arg.

2) Макрокоманда va_arg - читаем текущий необязательный и автоматически переводим указатель на следующий

Макрокоманда va_arg обеспечивает доступ к текущему параметру вызываемой функции и тоже имеет вид функции с двумя параметрами

type_arg va_arg(arg_ptr,type);

Эта макрокоманда извлекает значение типа type по адресу, заданному указателем arg_ptr, увеличивает значение указателя arg_ptr на длину использованного параметра (длина type) и таким образом параметр arg_ptr будет указывать на следующий параметр вызываемой функции.

Макрокоманда va_arg используется столько раз, сколько необходимо для извлечения всех параметров вызываемой функции.

3) Макрос va_end - используем после того как обработали все необходимые "необязательные " параметры

Макрос va_end используется по окончании обработки всех параметров функции и устанавливает указатель списка необязательных параметров на ноль (NULL).

пример =

#include 
   int main()
   { int n;
     int sred_znach(int,...);
     n=sred_znach(2,3,4,-1);
                     /* вызов с четырьмя параметрами */
     printf("n=%d",n);
     n=sred_znach(5,6,7,8,9,-1);
                    /* вызов с шестью параметрами   */
     printf("n=%d",n);
     return (0);
   }

   int sred_znach(int x,...);
   {
      int i=0,  j=0,  sum=0;
      va_list uk_arg;
      va_start(uk_arg,x);  /*  установка указателя uk_arg на  */
                           /*  первый необязятельный параметр */
      if (x!=-1) sum=x;    /*  проверка на пустоту списка     */
      else return (0);
      j++;
      while ( (i=va_arg(uk_arg,int))!=-1)
                                   /* выборка очередного   */
      {                            /* параметра и проверка */
        sum+=i;                    /* на конец списка      */
        j++;
      }
      va_end(uk_arg);         /* закрытие списка параметров   */
      return (sum/j);
   }

ещё ПРИМЕР функции с переменным числом аргументов=

void log_msg(const char *format, ...) // функция с переменным числом параметров 
{
    va_list ap; // объявляем указатель для работы со списокм необязательных параметров
    va_start(ap, format); //  переставляем указатель на первый из необязательных параметров

    vfprintf(BB_DATA->logfile, format, ap); /* записываем в файл журнала -
	передаём ap - указатель установленный на начало списка "необязательных"
	параметров с помощью вызванной ранее va_start(ap, format);
	*/
}
_____________________________________________
Источники(читать подробнее)=
Ключевые слова и фразы(для поиска)=
три точки - вместо параметра функции си
переменное число параметров си