cplus-plus.ru logo
Мы переехали на cplus-plus.ru
Главная страница В закладкиО сайтеКарта сайта
Добавить в закладки

Меню сайта

Полезные ссылки

Наша рассылка
Подписаться на рассылку
"C++ : cplus-plus.ru :
Рассылка статей C++"


Друзья сайта
alsproject.ru Выбор выходного разделительного конденсатора

Приветствую Вас, Гость · rss 26-Сен-2017, 11:43
Главная » Статьи » Статьи по C++

Произвольное число параметров в 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)
Просмотров: 803 | Рейтинг: 0.0/0