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.

 

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