Функции с переменным числом аргументов
Функции с переменным числом аргументов — это функции (например, printf), принимающие переменное количество аргументов.
В объявлении функции с переменным числом аргументов в качестве последнего параметра используется многоточие, например, int printf(const char* format, ...);. Подробнее о синтаксисе и автоматическом преобразовании аргументов см. в разделе аргументы переменной длины.
Для доступа к аргументам переменной длины из тела функции используются следующие средства библиотеки:
Типы |
|
хранит информацию, необходимую для va_start, va_arg, va_end и va_copy (определение типа) |
|
Макросы |
|
Определены в заголовочном файле <stdarg.h> |
|
|---|---|
| обеспечивает доступ к аргументам функции с переменным числом аргументов (функциональный макрос) |
|
| получает следующий аргумент функции с переменным числом аргументов (функциональный макрос) |
|
|
(C99) | создаёт копию аргументов функции с переменным числом аргументов (функциональный макрос) |
| завершает перебор аргументов функции с переменным числом аргументов (функциональный макрос) |
|
Пример
Вывод значений разных типов.
#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