Справочник по функциям С++. Подпрограммы классификации Подпрограммы преобразования
Скачать 3.41 Mb.
|
unlock----------------------------------------------------------------- Назначение Разрешает совместное использование файла. Синтаксис int unlock(int handle, long offset, long length); Прототип в io.h Замечания unlock обеспечивает интерфейс к механизму сов- местного использования файлов DOS 3.X. unlock удаляет защиту (замок), установленную перед этим функцией lock. Для предотвращения ошибки все замки должны быть сняты до закрытия файла. Возвращаемое unlock возвращает 0 в случае успешного заверше- значение ния и -1 в случае ошибочного. Переносимость unlock уникальна для DOS 3.x. Более старшие версии ее не поддерживают. См. также lock, sopen ----------------------------------------------------------------- va_...----------------------------------------------------------------- Назначение Позволяет использовать переменный список аргу- ментов. Синтаксис #include void va_start(va_list param, lastfix); type va_arg(va_list param, type); void va_end(va_list param); Прототип в stdarg.h Замечания Некоторые функции Си, такие как vfprintf и vprintf, имеют переменный список аргументов до- полнительно к фиксированным. Макросы семейства va_... позволяют осуществить доступ к такому списку аргументов. Эти макросы используются для поэлементной обработки списка аргументов, когда вызываемой функции неизвестно ни количество, ни типы передаваемых ей аргументов. Файл-заголовок stdarg.h содержит описание одно- го типа (va_list) и трех макросов (va_start, va_arg, va_end). va_list ------- Этот массив содержит информацию, необходимую для va_arg и va_end. Когда вызываемая функция принимает переменный список аргументов, он объ- является как переменная param типа va_list. va_start -------- Эта подпрограмма (реализованная как макрос) присваивает param значение указателя на первый элемент списка аргументов, который будет пере- дан функции. va_start должна быть вызвана до первого обращения к va_arg или va_end. va_start имеет два параметра: param и lastfix (param рассмотрен при описании va_list в преды- дущем параграфе; lastfix - имя последнего фик- сированного параметра, передаваемого вызываемой функции). va_arg ------ Эта процедура (также реализованная как макрос) расширяется в выражение, которое имеет тот же тип и значение, что и следующий аргумент, кото- рый должен быть передан функции (один из аргу- ментов переменного списка). Переменная param в va_arg должна быть той же самой переменной param, которая инициализировалась в va_start. При первом обращении к va_arg, она возвращает первый аргумент списка. При каждом последующем обращении к va_arg, она будет возвращать следу- ющий аргумент из списка. Она осуществляет это посредством использования первого значения param, после чего значение param увеличивается до значения указателя на следующий элемент. va_arg использует аргумент type как для получе- ния текущего элемента, так и для коррекции ука- зателя на следующий элемент. При каждом обраще- нии к va_arg она изменяет значение указателя param так, чтобы он указывал на следующий аргу- мент списка. va_end ------ Этот макрос помогает при обращении к функции обеспечить ее нормальное завершение. va_end мо- жет так модифицировать param, что он не сможет использоваться до повторного обращения к va_start. va_end должен быть вызван после того, как va_arg прочитает все аргументы списка; иг- норирование этого может послужить причиной странного и непредвиденного поведения вашей программы. Возвращаемое va_start и va_end не возвращают никаких значе- значение ний; va_arg возвращает текущий аргумент списка (тот самый, на который указывает param). Переносимость va_arg, va_start и va_end доступны в UNIX - системах. См. также v...printf, v...scanf Пример 1 #include #include /* вычисление суммы списка, завершающегося 0 */ void sum(char *msg, ...) { int total = 0; va_list ap; int arg; va_start(ap, msg); while ((arg = va_arg(ap,int)) !=0 ) { total += arg; } printf(msg, total); } main() { sum ("Итоговая сумма 1+2+3+4 равна %d\n", 1,2,3,4,0); } Вывод программы Итоговая сумма 1+2+3+4 равна 10 Пример 2 #include #include void error(char *format,...) { va_list argptr; printf("ошибка: "); va_start(argptr, format); vprintf(format, argptr); va_end(argptr); } main() { int value = -1; error("это просто сообщение об ошибке \n"); error("обнаружено неверное значение %d\n, value); } Вывод программы ошибка: это просто сообщение об ошибке ошибка: обнаружено неверное значение -1 ----------------------------------------------------------------- |