Головна |
Три крапки в списку параметрів користувача функції використовується тоді, коли число аргументів заздалегідь невідомо. При цьому невизначену кількість параметрів можна вказати в її прототипі наступним чином:
void f1(int a, double b, ...);
Такий запис вказує компілятору на те, що за обов'язковими фактичними аргументами для параметрів a и b можуть слідувати, а можуть і не слідувати інші аргументи при виклику цієї функції.
Перелічимо основні особливості використання даного механізму.
1. Використовується кілька макрокоманд для доступу до параметрів таких функцій, це:
va_list и va_start - Макроси підготовки доступу до параметрів;
va_arg - Використання параметрів;
va_end - Отчистка перед виходом.
Вони оголошені в заголовки stdarg.h.
2. Така функція повинна мати мінімум один параметр (іменований) для передачі їй кількості переданих аргументів.
3. Для макросу va_start необхідно передати два аргументи - ім'я списку параметрів, який задає va_list і їх кількість.
4. Порушувати вказаний порядок макрокоманд можна. Інакше можна отримати непередбачувані наслідки.
5. Для макросу va_arg потрібно крім імені списку параметрів передати і передбачуваний тип. У разі невідповідності типів - помилка.
Використання крапок цілком вимкнути перевірку типів параметрів. Три крапки необхідно, тільки якщо змінюються і число параметрів, і їх тип.
Наступний приклад ілюструє цю можливість.
#include
#include
void f1 (double s, int n ...) {
int v;
va_list p;
va_start (p, n);
printf ("\ n Double S =% lf", s);
for (int i = 1; i <= n; i ++) {
v = va_arg (p, int);
printf ("\ n Argument% d =% d", i, v);
}
va_end (p);
}
void main (void) {
f1 (1.5, 3, 4, 5, 6);
}
В результаті отримаємо:
Double S = 1.500000
Argument 1 = 4
Argument 2 = 5
Argument 3 = 6
Press any key to continue
Параметри зі значеннями за замовчуванням | Поняття шаблону функції
Алгоритм, що використовує стек | приклад реалізації | поняття хеширования | Приклади хеш-функцій | схеми хеширования | Приклади реалізації схем хешування | ЗАВДАННЯ 8. Обробка списків | ЗАВДАННЯ 9. Дерева і польський запис | Використання маніпуляторів | Приклад створення одновимірного динамічного масиву |