Функции с переменным числом аргументов
Функции с переменным числом аргументов (например, printf) — это функции, которые принимают переменное количество аргументов.
Объявление функции с переменным числом аргументов использует многоточие в качестве последнего параметра, например, int printf(const char* format, ...);. Дополнительные сведения о синтаксисе и автоматических преобразованиях аргументов см. в разделе аргументы с переменным числом.
Доступ к аргументам с переменным числом из тела функции осуществляется с помощью следующих средств библиотеки:
Макросы |
|
Определено в заголовочном файле <stdarg.h> |
|
|---|---|
| активирует доступ к аргументам функции с переменным числом аргументов (макрос-функция) |
|
| получает следующий аргумент функции с переменным числом аргументов (макрос-функция) |
|
|
(C99) | создает копию аргументов функции с переменным числом аргументов (макрос-функция) |
| завершает проход по аргументам функции с переменным числом аргументов (макрос-функция) |
|
Тип |
|
| содержит информацию, необходимую для va_start, va_arg, va_end и va_copy (тип) |
|
Пример
Вывод значений разных типов.
#include <stdio.h>
#include <stdarg.h>
void simple_printf(const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
while (*fmt != '\0') {
if (*fmt == 'd') {
int i = va_arg(args, int);
printf("%d\n", i);
} else if (*fmt == '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);
} else if (*fmt == 'f') {
double d = va_arg(args, double);
printf("%f\n", d);
}
++fmt;
}
va_end(args);
}
int main(void)
{
simple_printf("dcff", 3, 'a', 1.999, 42.5);
}Вывод:
3 a 1.999000 42.50000
Справочные материалы
- Стандарт 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/w/c/variadic