The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

A.11 Списки с изменяемым числом аргументов — stdarg.h

A.11 Списки с изменяемым числом аргументов — stdarg.h

Предыдущая  Содержание  Следующая V*D*V

#include <stdarg.h>

 

void fatal (const char * fmt, ... ) {

    va_list ap;

    int code;

 

    va_start(ap, fmt);            последнее явно указанное имя параметра

    code = va_arg(ap, int);       значение следующего аргумента

    vprintf(fmt, ap);

    va_end(ap);                   повторная инициализация

    exit(code);

}

 

Если список параметров в прототипе функции и в определении функции заканчивается тремя точками, эта функция может быть вызвана с произвольным числом аргументов. Параметра с количеством аргументов в конкретном вызове нет; поэтому чтобы определить, что аргументов больше нет, должен использоваться или формат, как у printf(), или какое-то завершающее значение аргумента.

Для обработки списка аргументов используются макросы из stdarg.h. va_list — тип, чтобы определить переменную для обхода списка аргументов. Эта переменная инициализируется вызовом va_start(); при инициализации в качестве аргумента должно использоваться последнее явно указанное имя параметра. va_arg() это макрос, который отдаёт следующее значение аргумента; он принимает тип этого значения в виде аргумента. va_end() завершает обработку списка аргументов; после этого вызова список аргументов можно обходить снова.

Значения типа va_list могут быть переданы другим функциям. В частности, есть версии функции printf, которые принимают значения va_list вместо обычного списка значений для распечатки.

Значения в переменной части списка аргументов подчиняются классическим правилам преобразования: целые значения передаются как int или long; значения с плавающей точкой передаются как double. Тип аргумента, указываемый во втором параметре va_arg(), не может быть очень сложным — при необходимости может использоваться typedef.

 

Предыдущая  Содержание  Следующая