Đôi khi cần hàm nhận số lượng đối số biến đổi thay vì số cố định. C/C++ hỗ trợ định nghĩa hàm chấp nhận số lượng tham số biến đổi.
int func(int, ...) { ... }
int main() {
func(1, 2, 3);
func(1, 2, 3, 4);
}
Lưu ý: tham số cuối cùng của func() là ellipsis (...), tham số ngay trước đó luôn là int đại diện cho tổng số đối số biến. Để dùng tính năng này, cần stdarg.h cung cấp macro/hàm:
- Định nghĩa hàm với tham số cuối là ellipsis, tham số trước đó là int đếm số đối số.
- Tạo biến
va_listtrong định nghĩa hàm (định nghĩa trong stdarg.h). - Dùng tham số
intvà macrova_startkhởi tạova_list. - Dùng macro
va_argvàva_listtruy cập từng đối số. - Dùng macro
va_enddọn dẹp bộ nhớ chova_list.
Ví dụ hàm tính trung bình cộng số lượng đối số biến:
Ví dụ
#include <stdio.h>
#include <stdarg.h>
double average(int num, ...) {
va_list valist;
double sum = 0.0;
int i;
va_start(valist, num);
for (i = 0; i < num; i++) {
sum += va_arg(valist, int);
}
va_end(valist);
return sum / num;
}
int main() {
printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2, 3, 4, 5));
printf("Average of 5, 10, 15 = %f", average(3, 5, 10, 15));
return 0;
}
Kết quả
Average of 2, 3, 4, 5 = 3.500000 Average of 5, 10, 15 = 10.000000