Добавить в закладки |
|
Меню сайта |
|
Полезные ссылки |
|
Друзья сайта |
|
|
Приветствую Вас, Гость · |
22-Янв-2025, 17:45 |
|
Произвольное число параметров в C++
Для некоторых функций нельзя заранее предвидеть число и тип параметров вызова. Такие функции объявляют, завершая список параметров многоточием «...». int printf (const char*, . . . );
Тем самым говорится, что в вызове printf должен быть, по меньшей мере, один параметр char*, а остальные — не обязательны.
Работа с нефиксированными аргументами основана на том, что аргументы, передаваемые функции, располагаются в памяти по порядку, один за другим. Для упрощения доступа к нефиксированным аргументам применяют макросы va_arg, va_end, и va_start, определенные в заголовочном файле stdarg.h.
typedef char* va_list; #define _INTSIZEOF(n) \ ((sizeof(n)+sizeof(int)-1) &~(sizeof(int)-1) #define va_.start (ар , v) \ (ар = (va_list)&v + _INTSIZEOF(v))
#define va_arg(ap,t) \ (*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)
#define va_end(ap) (ap = (va_list)0)
Внешне вызов макроса похож на вызов функции, подробнее о макросах будет сказано позже.
Макрос ua_start(ap, v) направляет указатель ар на первый нефиксированный аргумент функции (тот, что следует за последним фиксированным аргументом v). Заметим, что указатель ар должен быть определен как локальная переменная функции
va_listap;.
Макрос vajarg(ap, t) возвращает значение того нефиксированного аргумента типа t, на который указывает ар, и передвигает указатель ар на следующий по порядку нефиксированный аргумент. Макрос va_end(ap) просто обнуляет указатель ар.
Пример. Определить функцию, которая складывает значения своих аргументов, начиная со 2-го. Первый аргумент содержит количество слагаемых. Остальные аргументы должны быть целыми или автоматически приводиться к ним.
#include <stdarg.h> int sum(int number, ...) va_list ар; // указатель на аргумент int total = 0; // накапливаемая сумма
// установить указатель на 1-й аргумент va_start(ap, number);
for (int i = 1; i <= number; i++) // суммировать и сдвинуть указатель // на размер целого числа total += va_arg(ap, int); // обнулить указатель va_end(ар); return total;
Пример. Определить функцию void con(char* buf, int limit,...) присоединения к строке, находящейся в buf, других строк. Параметр limit содержит общий размер буфера.
#include <stdarg.h> void con(char* buf, int limit, ...) { char *p; va_list ap; va_start(ap, limit); while (p = va_arg(ap, char*)) if (strlen(buf) + strlen(p) < limit) strcat(buf, p) ; va_end(ap);
Источник: http://www.cplus-plus.ru |
Категория: Статьи по C++ | Добавил: FazaNaka (22-Окт-2010)
|
Просмотров: 1831
| Рейтинг: 0.0/0 |
|
|