Язык программирования C

Скачать в pdf «Язык программирования C»


Вот как на самом деле объявляется функция printf: int printf(char *fmt, …)


Здесь конструкция . . . означает, что количество и типы аргументов могут меняться. Такая конструкция может стоять только в конце списка аргументов. Наша функция minprintf объявляется следующим образом: void minprintf(char *fmt, …)


В отличие от printf, она не возвращает количество выведенных символов.


Сложность заключается в том, как же перебрать список аргументов в функции minprintf, когда у него даже нет имени. В стандартном заголовочном файле <stdarg.h> на этот случай имеется набор макроопределений, дающих способ перебора списка. Реализация этого заголовочного файла системно-зависима, однако интерфейс всегда единообразный.


Для объявления переменной, ссылающейся по очереди на каждый аргумент, имеется тип va_list. В функции minprintf эта переменная имеет имя ар (сокращение от argument pointer— указатель на аргумент). Макрос va_start инициализирует ар так, чтобы переменная указывала на первый безымянный аргумент. Этот макрос нужно вызвать один раз перед тем, как обращаться к переменной ар. Функция должна иметь как минимум один аргумент с именем; последний именованный аргумент используется макросом va start для инициализации своей работы.


Каждый вызов va_arg возвращает один аргумент и передвигает указатель ар на следующий. Чтобы определить, какого типа аргумент нужно возвращать и на сколько передвигать указатель, va_arg использует заданное ему имя типа. Наконец, макрос va_end выполняет необходимые завершающие операции. Его необходимо вызвать до возвращения из функции.


Все перечисленное служит основой для нашей упрощенной версии printf: #include <stdarg.h>


/* minprintf:    ограниченная версия printf


со списком аргументов переменной длины */ void minprintf(char *fmt, …)

{


va_list ар; /* указатель на безымянные аргументы */ char *р, *sval; int ival; double dval;

Скачать в pdf «Язык программирования C»