A.11 Списки с изменяемым числом аргументов — stdarg.h |
Предыдущая Содержание Следующая |
#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.
|
Предыдущая Содержание Следующая |