Spec-Zone.ru › C

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

Функции с переменным числом аргументов — это функции (например, printf), принимающие переменное количество аргументов.

В объявлении функции с переменным числом аргументов в качестве последнего параметра используется многоточие, например, int printf(const char* format, ...);. Подробнее о синтаксисе и автоматическом преобразовании аргументов см. в разделе аргументы переменной длины.

Для доступа к аргументам переменной длины из тела функции используются следующие средства библиотеки:

Типы
va_list
хранит информацию, необходимую для va_start, va_arg, va_end и va_copy
(определение типа)
Макросы
Определены в заголовочном файле <stdarg.h>
va_start
обеспечивает доступ к аргументам функции с переменным числом аргументов
(функциональный макрос)
va_arg
получает следующий аргумент функции с переменным числом аргументов
(функциональный макрос)
va_copy
(C99)
создаёт копию аргументов функции с переменным числом аргументов
(функциональный макрос)
va_end
завершает перебор аргументов функции с переменным числом аргументов
(функциональный макрос)

Пример

Вывод значений разных типов.

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

void simple_printf(const char* fmt, ...)
{
    va_list args;

    for (va_start(args, fmt); *fmt != '\0'; ++fmt)
    {
        switch(*fmt)
        {
            case 'd':
            {
                int i = va_arg(args, int);
                printf("%d\n", i);
                break;
            }
            case 'c':
            {
                // A 'char' variable will be promoted to 'int'
                // A character literal in C is already 'int' by itself
                int c = va_arg(args, int);
                printf("%c\n", c);
                break;
            }
            case 'f':
            {
                double d = va_arg(args, double);
                printf("%f\n", d);
                break;
            }
            default:
                puts("Unknown formatter!");
                goto END;
        }
    }
END:
    va_end(args);
}

int main(void)
{
    simple_printf("dcff", 3, 'a', 1.969, 42.5);
}

Вывод:

3
a
1.969000
42.50000

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
    • 7.16 Аргументы переменной длины <stdarg.h> (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
    • 7.16 Аргументы переменной длины <stdarg.h> (стр.: TBD)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.16 Аргументы переменной длины <stdarg.h> (стр.: 269-272)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.15 Аргументы переменной длины <stdarg.h> (стр.: 249-252)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
    • 4.8 АРГУМЕНТЫ ПЕРЕМЕННОЙ ДЛИНЫ <stdarg.h>

См. также

Документация C++ для функций с переменным числом аргументов

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/variadic

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API