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

 

Краткие теоретические сведения

 

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

     Определение функции с переменным числом параметров:

<тип><имя>(<явные параметры>, . . . )

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

1)  известен признак конца списка переменных параметров;

2)  известно количество параметров, которое передается как обязательный параметр.

Пример:

 

#include <iostream.h>

int sum (int k, . . .)

{

int *p = &k; //настроили указатель на параметр k

int s=0;

for ( ; k!=0;  k--)

   s+=*(++p);  //   ++p - "перевод" указателя на следующий параметр

return s;

}

void main( )

{

cout<<”\nСумма(2,4,6)= ”<<sum(2,4,6); //находит сумму 4+6

cout<<”\nСумма(4,1,2,3,4)= ”<<sum(4,1,2,3,4); //находит сумму 1+2+3+4

}

Для доступа к списку параметров используется указатель *p типа int. Он устанавливается на начало списка параметров в памяти, а затем p перемещается по адресам фактических параметров (++p).