VARARGS(5) VARARGS(5) НАЗВАНИЕ varargs - обработка списка аргументов переменной длины СИНТАКСИС |#include | |va_alist | |va_dcl | |void va_start (pvar) |va_list pvar; | |тип va_arg (pvar, тип) |va_list pvar; | |void va_end (pvar) |va_list pvar; ОПИСАНИЕ Данный набор макросов позволяет писать мобильные функ- ции с переменным количеством аргументов. Функциям с пе- ременным числом аргументов [таким как printf(3S)], не использующим varargs, присуща немобильность, так как на различных компьютерах действуют различные соглашения о передаче аргументов. Va_alist используется как аргумент в заголовке функции, которая на самом деле будет принимать переменное число аргументов. Макрос va_dcl раскрывается в описание va_alist. За va_dcl не надо ставить точку с запятой. Va_list служит типом переменной, используемой для прос- мотра списка аргументов. Макрос va_start вызывается для инициализации pvar перед просмотром списка аргументов. Макрос va_arg вернет следующий аргумент в списке, на который указывает pvar. Необходимо указывать ожидаемый тип аргумента, поскольку во время выполнения узнать его, вообще говоря, нельзя. Макрос va_end используется для окончания просмотра. Возможен многократный просмотр списка аргументов, каж- дый просмотр открывается макросом va_start и завершает- ся макросом va_end. ПРИМЕР Ниже приводится возможная реализация системного вызова execl(2). |#include |#define MAXARGS 100 | |/* execl вызывается следующим образом: | execl (file, arg1, arg2, ..., (char *)0); |*/ |execl(va_alist) |va_dcl |{ | va_list ap; | char *file; | char *args [MAXARGS]; | int argno=0; | | va_start(ap); | file = va_arg(ap, char *); | while ((args [argno++] = va_arg(ap, char *)) | != (char *)0) | ; | va_end(ap); | return execv(file, args); |} СМ. ТАКЖЕ exec(2), printf(3S), vprintf(3S). ПРИМЕЧАНИЯ Способ определения числа аргументов зависит от вызывае- мой функции - универсального способа (например, осно- ванного на анализе стека) не существует. Так, при вызо- ве execl последний аргумент должен быть нулевым указа- телем; printf определяет количество аргументов по фор- мату. Было бы ошибкой задавать в качестве второго аргумента макроса va_arg типы char, short или float, так как сог- ласно правилам языка C перед вызовом функции аргументы типов char и short приводятся к типу int, а аргументы типа float - к типу double.