лекции проги / lec9
.pdfМакросредства для переменного числа параметров.
Макрокоманды, обеспечивающие независящий от реализации компилятора способ доступа к конкретным спискам фактических параметров переменной длины имеют формат: (необходимо подключить stdarg.h)
Также определен специальный тип данных va_list. Такой тип должны иметь переменные, используемые при обращении к данным макрокомандам. При обращении к макросу va_arg() необходимо в качестве 2 - го параметра использовать обозначение типа type очередного параметра к которому выполняется доступ.
Порядок использования перечисленных макросредств в теле функции.
IСначало в теле функции определяется объект типа va_list. Например так:
va_list factor ;
Определенный таким образом объект обладает свойствами указателя.
Порядок использования перечисленных макросредств в теле функции.
IСначало в теле функции определяется объект типа va_list. Например так:
va_list factor ;
Определенный таким образом объект обладает свойствами указателя.
IС помощью макроса va_start объект factor связывается с 1 - м необязательным параметром. Для этого используется последний явный параметр (last):
va_start(factor , last);
Порядок использования перечисленных макросредств в теле функции.
IСначало в теле функции определяется объект типа va_list. Например так:
va_list factor ;
Определенный таким образом объект обладает свойствами указателя.
IС помощью макроса va_start объект factor связывается с 1 - м необязательным параметром. Для этого используется последний явный параметр (last):
va_start(factor , last);
IТеперь с помощью разыменования указателя factor мы можем получить значение 1 - го фактического параметра из переменного списка. При этом также необходимо передать в функцию тип этого параметра.
IЕсли определен тип factor очередного параметра, то обращение к макросу
va_arg(factor , type);
позволяет получить значение очередного фактического параметра типа type, а также изменить значение указателя factor на адрес следующего параметра списка.
IЕсли определен тип factor очередного параметра, то обращение к макросу
va_arg(factor , type);
позволяет получить значение очередного фактического параметра типа type, а также изменить значение указателя factor на адрес следующего параметра списка.
IТеперь узнав тип следующего параметра (к примеру type1) можно вновь обратиться к макросу va_arg(factor , type1); и т.д.
IЕсли определен тип factor очередного параметра, то обращение к макросу
va_arg(factor , type);
позволяет получить значение очередного фактического параметра типа type, а также изменить значение указателя factor на адрес следующего параметра списка.
IТеперь узнав тип следующего параметра (к примеру type1) можно вновь обратиться к макросу va_arg(factor , type1); и т.д.
IПосле обработки всего списка параметров, для корректного возврата из функции используется макрокоманда va_end: va_end(factor );
Пример функции с переменным количеством параметров.
Программа аналог функции printf. Для простоты будем использовать спецификаторы только %d и %f.