Variadic functions
Материал из cppreference.com
|
|
Эта страница была переведена автоматически с английской версии вики используя Переводчик Google.
Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке. Щёлкните здесь, чтобы увидеть английскую версию этой страницы |
Variadic функции являются функциями (например, std::printf), которые принимают переменное число аргументов.
Оригинал:
Variadic functions are functions (e.g. std::printf) which take a variable number of arguments.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Содержание |
[править] Статистика
Чтобы объявить Вариативный функции, многоточие используется в качестве последнего параметра, например, int printf(const char *format, ...);. Параметры, передаваемые переменным числом функций можно получить с помощью следующих макросов и типов
Оригинал:
To declare a variadic function, an ellipsis is used as the last parameter, e.g. int printf(const char *format, ...);. Parameters passed to a variadic function can be accessed using the following macros and types:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
| Заголовочный файл
<cstdarg> | |
| Макрос, получающий доступ к аргументам функции с переменным числом аргументов (функция-макрос) | |
| Макрос, получающий следующий аргумент из функции с переменным числом аргументов. (функция-макрос) | |
| (C++11) |
Макрос, создающий копию экземпляра va_list (функция-макрос) |
| Макрос, завершающий проход по аргументам функции с переменным числом аргументов (функция-макрос) | |
| Тип данных, необходимый для использования макросов va_start, va_arg, va_end, и va_copy (класс) | |
[править] По умолчанию преобразований
Когда Вариативный функция вызывается, после именующее к RValue, массива в указатель, и функция в указатель преобразований, каждый аргумент, который является частью списка переменных аргументов подвергается дополнительных преобразований известный как акциях аргумент по умолчанию " ':
Оригинал:
When a variadic function is called, after lvalue-to-rvalue, array-to-pointer, and function-to-pointer преобразований, each argument that is a part of the variable argument list undergoes additional conversions known as default argument promotions:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
- std::nullptr_t превращается в void*Оригинал:std::nullptr_t is converted to void*Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. - float аргументы преобразуются в double как в плавающей точкой продвижения по службеОригинал:Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. - bool, char, short, и незаданной перечисления преобразуются в int или более широкого целого типа, как в целое продвижения по службеОригинал:bool, char, short, and unscoped enumerations are converted to int or wider integer types as in целое продвижения по службеТекст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Только арифметика, перечислением, указателем, указателем на член, и аргументы типа класса допускаются.
Оригинал:
Only arithmetic, enumeration, pointer, pointer to member, and class type arguments are allowed.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
[править] Альтернативы
- Variadic шаблоны также может быть использован для создания функций, которые принимают переменное число аргументов. Они часто являются лучшим выбором, потому что они не накладывают ограничения на типы аргументов, не выполняют интегральные и с плавающей точкой акциях, и типа безопасно. (начиная с C++11)Оригинал:Variadic templates can also be used to create functions that take variable number of arguments. They are often the better choice because they do not impose restrictions on the types of the arguments, do not perform integral and floating-point promotions, and are type safe. (начиная с C++11)Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. - Если все переменные аргументы общий тип, std::initializer_list обеспечивает удобный механизм (хотя и с другой синтаксис) для доступа к переменной аргументы.Оригинал:If all variable arguments share a common type, a std::initializer_list provides a convenient mechanism (albeit with a different syntax) for accessing variable arguments.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
[править] Пример
Запустить этот код
#include <iostream> #include <cstdarg> 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); std::cout << i << '\n'; } else if (*fmt == 'c') { // note automatic conversion to integral type int c = va_arg(args, int); std::cout << static_cast<char>(c) << '\n'; } else if (*fmt == 'f') { double d = va_arg(args, double); std::cout << d << '\n'; } ++fmt; } va_end(args); } int main() { simple_printf("dcff", 3, 'a', 1.999, 42.5); }
Вывод:
3 a 1.999 42.5

