ПрограммированиеСистемный программист

Опишите различия между функциями с переменным числом аргументов и стандартными функциями в C. Как реализовать функцию с переменным числом аргументов?

Проходите собеседования с ИИ помощником Hintsage

Ответ

В языке 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); // Ошибка компиляции.

Примеры реальных ошибок из-за незнания тонкостей темы


История

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

История

Один разработчик забыл вызывать va_end, что привело к утечке ресурсов на некоторых архитектурах. Симптомы проявились только при многократном использовании функции.

История

При обработке функции с переменными аргументами использовали va_list дважды без вызова va_copy, что вызвало непредсказуемое поведение. Ошибка проявилась не сразу, а только после изменений компилятора.