· добавить в конец списка специальный параметр-индикатор с уникальным значением
· передавать в функцию количество параметров явно, с помощью одного из обязательных параметров. Переход от одного параметра к другому происходит с помощью указателей с использованием адресной арифметики.
//Функция выполняет суммировние значений своих параметров
# include < costream.h >
long summa (int k, …); //k - количество параметров
{
int* pik = & k;
long total = 0;
for (;k;k--) total + = * (++pik); return total;
}
void main ()
{
cout << summa (2,6,4); cout<<summa(4,10,20,30,40);
}
extern – по умолчанию, функции доступны вне модулей, внутри которых они определены
static – функция доступна только внутри того модуля, в котором она определена
cdecl – по умолчанию стандартная для С++ последовательность размещения параметров в стеке, согласно которой первым обрабатывается и помещается в стек последний из параметров функции. При этом у него оказывается максимальный адрес. Именно поэтому для перехода от одного параметра к другому указатель заданного типа увеличивается на единицу. Считается, сто именно вызывющий оператор отвечает за удаление из стека любых значений аргументов, переданных функции.
pascal – противоположный принятому в С++ порядок размещения и обработки параметров в стеке, свойственный языку Pascal. Когда оператор вызывает функцию, значения аргументов проталкиваются в стек. Функция сама отвечает за удаление из стека лююых значений аргументов. Применение модификатора pascal необходимо, когда функция, написанная на С или С++, будет вызываться из программы на Pascal.
_fastcall – аргументы функции передаются через регистры (быстрый вызов)
interrupt – функция объявляется как программа обработки прерываний
near – объявляет функцию, которую можно вызвать только внутри того же самого сегмента (для моделей памяти tiny, small,compact)
far - объявляет функцию, которую можно вызвать из любого сегмента (для моделей памяти medium, large) .
Определяются со спецификатором inline
inline float module (float X = 0 , float y = 0)
//возвращает расстояние от начала координат до точки (х,у)
{return sgrt (x*x+y*y);}
Особенность обработки заключается в том, что вместо передачи управления единственному экземпляру тела функции код функции встраивается непосредственно в точку вызова. Это приводит к увеличению размера кода программы, но и к увеличению скорости ее выполнения. Это простейшие функции, не содержащие операторов цикла, перехода, переключателей и не являющиеся рекурсивными.
Массивы могут быть параметрами, возвращаемыми функциями, как правило, через указатель, и могут быть входными параметрами функции. При этом возникает проблема определения количества элементов в массиве, так как в C++ нельзя определить размерность массива по его имени или указателю на массив.
Если массив параметра функции не является символьной строкой, то надо использовать массивы фиксированного размера или передавать размер массива в функцию явным образом.
int sum (int n, int A [])
{int S=0; for (int i=0; i<n; i++) S+=A[i]; return S}
void main ()
{
int MA []={1,2,3,4,5};
cout << sum (sizeof (MA) / sizeof (MA[0]), MA);
}
тип_возвращ_значения (*имя_указателя) (сигнатура);
int (* funcptr) (char);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.