В отличие от вашей традиционной функции, которая имеет установленный набор аргументов, вариативная функция может получать неизвестное количество аргументов, и вы сможете циклически перебирать их, используя определенную библиотеку. Здесь вы можете найти основы, чтобы лучше их понять.
Как это работает? Вы должны объявить свой прототип функции, как обычно, и добавить три точки (…) в качестве последнего аргумента. Это сигнализирует о возможности того, что могут быть дополнительные аргументы, и они не являются обязательными для функции.
Прототип должен выглядеть примерно так:
int functionName (int b, …)
Предыдущий оператор объявляет вариативную функцию с двумя обязательными аргументами, а затем идут три точки, которые сигнализируют о том, что можно ввести неизвестное количество аргументов.
Почему мы должны использовать вариативные функции? Объявляя этот тип функции, вы добавляете гибкости коду. Например: printf, вероятно, самая известная функция, использующая этот принцип. Printf будет принимать N аргументов и имеет много разных параметров для форматирования вывода, который он будет печатать.
Чтобы начать создание программы, использующей эту структуру, вы должны включить <stdarg.h>
в раздел заголовка вашей программы вместе со следующими макросами, чтобы вы действительно могли получить доступ ко всем тем точкам данных, которые мог ввести пользователь:
Первый макрос, о котором вам нужно знать, - это va_list
: он поможет вам инициализировать указатель аргументов.
Во-вторых, вы должны использовать va_start
: он будет указывать на первый элемент (из обязательных).
В-третьих, используйте va_arg
: это тот, который поможет вам указать на первый из необязательных аргументов, введенных пользователем, и каждый раз, когда он вызывается, он будет переходить к следующему аргументу.
В-четвертых, также необязательный, макрос va_end
: в нем нет необходимости, поскольку GCC даже не заметит его, но вы все равно можете добавить его, если используете другой компилятор.
Самый простой пример применения этих аргументов к функции:
Вышеупомянутая функция служит довольно понятной цели: она складывает неизвестное количество чисел и возвращает целое число с результатом. Функция начинается с получения обязательной переменной, которая в основном представляет собой количество аргументов, сохраненных в следующем списке (часть с «…»). Это поможет пользователю узнать, до тех пор, пока цикл не должен выполняться, чтобы пройти весь список аргументов.
Список объявляется с помощью макроса va_list
, затем пользователь проверяет, является ли список пустым или нет. После этого список инициируется с помощью макроса va_start
и передачи имени списка, а также количества аргументов, которые он имеет (в данном случае обозначается буквой «n»).
Теперь идет цикл, который отвечает за фактическое сложение чисел, сохраненных в списке. Он делает это с помощью переменной sum
, которая была ранее создана в качестве счетчика, который начнет сохранять аргументы (в данном случае числа) один за другим и складывать их. Принцип работы va_arg
заключается в том, что каждый раз, когда он вызывается, он переходит к следующему аргументу в строке, поэтому цикл «for» будет вызывать его столько раз, сколько аргументов в списке (n
раз).
После завершения всего этого процесса программа вызывает макрос va_end
, чтобы закрыть список, а затем возвращает окончательный результат, сохраненный в sum
.
Это простой пример того, как работает вариативная функция. Помимо простого добавления чисел, можно создать гораздо больше приложений, но эта статья даст вам представление о том, как работает логика, лежащая в основе концепции.
Всего хорошего!
S.
Дайте мне знать, если у вас есть отзывы.
Свяжитесь со мной в Twitter: @SergioPietri