Вызовы с переменным количеством аргументов
Частичный список параметров может завершаться многоточием (запятая и три точки за ней: , ...). Это означает возможность передать функции еще несколько аргументов, о которых не предоставляется дополнительной информации. Проверка типов в таких аргументах не выполняется. Хотя бы один параметр должен предшествовать блоку многоточия, и этот блок должен являться последним токеном в списке параметров. Без блока многоточия поведение функции является неопределенным, если она получает параметры в добавление к объявленным в списке параметров.
Для вызова функции с переменным количеством аргументов достаточно указать любое количество аргументов в вызове функции. В качестве примера можно привести функцию printf
из библиотеки времени выполнения C. Вызов функции должен включать один аргумент для каждого объявленного имени типа в списке параметров или списке типов аргументов.
Все аргументы, заданные в вызове функции, помещаются в стек. Исключение составляют случаи, когда задано соглашение о вызовах __fastcall
. Число параметров, объявленных для функции, определяет, сколько аргументов взяты из стека и присвоены параметрам. Ответственность за извлечение любых дополнительных аргументов из стека и за определение числа присутствующих аргументов лежит на пользователе. Файл STDARG.H содержит макросы в стиле ANSI для доступа к аргументам функций, принимающих переменное число аргументов. Кроме того, до сих пор поддерживаются макросы в стиле XENIX из файла VARARGS.H.
Ниже приводится пример объявления функции, вызывающей переменное число аргументов.
int average( int first, ...);