Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Функции с переменным числом аргументов в C: практическое руководство

Иногда нужно написать функцию, принимающую переменное количество аргументов (как printf). В C это делается через эллипсис (...) и макросы из заголовочного файла <stdarg.h>.

Объявление такой функции

int func(int count, ...);  // последний параметр — ..., перед ним int — число аргументов

Параметр перед ... (обычно int) по соглашению указывает количество последующих аргументов.

Пошаговая работа с va_list

  1. Объявите переменную типа va_list (определён в stdarg.h).
  2. Инициализируйте её макросом va_start(va_list, last_fixed_param).
  3. Получайте аргументы макросом va_arg(va_list, type) — каждый вызов возвращает следующий аргумент заданного типа.
  4. Завершите работу макросом va_end(va_list) (очищает память).

Пример: функция average()

#include <stdio.h>
#include <stdarg.h>

double average(int num, ...) {
    va_list args;
    double sum = 0.0;

    va_start(args, num);
    for (int i = 0; i < num; i++) {
        sum += va_arg(args, int);  // предполагаем, что все аргументы int
    }
    va_end(args);

    return sum / num;
}

int main() {
    printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2, 3, 4, 5));
    printf("Average of 5, 10, 15 = %f\n", average(3, 5, 10, 15));
    return 0;
}

Результат:

Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000

Первый аргумент — количество последующих переменных аргументов. Только эллипсис (...) позволяет передавать переменное их число.

Важные замечания

Язык C

  1. Четыре проверенных паттерна пользовательских функций в C
  2. Классы хранения в C: область видимости, время жизни и производительность
  3. Как передавать одномерные и двумерные массивы в функции в C — практическое руководство
  4. Аргументы функций в Python: позиционные, именованные и параметры по умолчанию
  5. Переменные и типы данных в C++: подробное руководство по int, double, char, string, bool
  6. Переменные, типы данных и константы в C — практическое руководство
  7. Понимание назначений в Verilog: типы, синтаксис и лучшие практики
  8. Переменные в C: объявление, определение, инициализация, область видимости и классы хранения
  9. Функции в C: объявление, определение, вызов, аргументы (по значению и по ссылке), рекурсия
  10. Указатели в C: полное руководство — объявление, арифметика, массивы, функции и динамическая память