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

Как это работает? Вы должны объявить свой прототип функции, как обычно, и добавить три точки (…) в качестве последнего аргумента. Это сигнализирует о возможности того, что могут быть дополнительные аргументы, и они не являются обязательными для функции.

Прототип должен выглядеть примерно так:

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