mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк 

Златоуст.Ru

 

 

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.



 

 

Бернадинер Марк Абрамович

Мое резюме

Компьютерная страничка

Ресурсы сети

Фотоальбом

 

 

 

mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк