В языке C функции могут принимать фиксированное или переменное число аргументов. Стандартные функции определяются так:
int sum(int a, int b) { return a + b; }
Для переменного числа аргументов используется макрос <stdarg.h>, что позволяет обработать разное количество входных параметров.
Пример:
#include <stdarg.h> #include <stdio.h> int sum(int count, ...) { int total = 0; va_list args; va_start(args, count); for (int i = 0; i < count; ++i) { total += va_arg(args, int); } va_end(args); return total; }
Чем отличаются функции с переменным числом аргументов от перегруженных функций, и как реализовать перегрузку в C?
Ответ: В C нет поддержки перегрузки функций как в C++: имя функции и количество аргументов должны быть уникальны. Переменные аргументы реализуют универсальный интерфейс, но это не "перегрузка".
Пример (неправильно):
// Это не сработает в C, так как нельзя создавать две функции с одним именем: int foo(int a); float foo(float b); // Ошибка компиляции.
История
История
va_end, что привело к утечке ресурсов на некоторых архитектурах. Симптомы проявились только при многократном использовании функции.История
При обработке функции с переменными аргументами использовали va_list дважды без вызова va_copy, что вызвало непредсказуемое поведение. Ошибка проявилась не сразу, а только после изменений компилятора.