Đôi khi, bạn có thể gặp một tình huống, khi bạn muốn có một hàm, hàm này có thể nhận số lượng đối số thay đổi, tức là tham số, thay vì số lượng tham số được xác định trước. Ngôn ngữ lập trình C / C ++ cung cấp giải pháp cho tình huống này và bạn được phép xác định một hàm có thể chấp nhận số lượng tham số thay đổi dựa trên yêu cầu của bạn. Ví dụ sau đây cho thấy định nghĩa của một hàm như vậy.
int func(int, ... ) { . . . } int main() { func(1, 2, 3); func(1, 2, 3, 4); }
Cần lưu ý rằng hàm func () có đối số cuối cùng là dấu chấm lửng, tức là ba dote (...) và đối số ngay trước dấu chấm lửng luôn là int sẽ đại diện cho tổng số đối số biến số được truyền vào. Để sử dụng chức năng như vậy, bạn cần sử dụng stdarg.h tệp tiêu đề cung cấp các hàm và macro để triển khai chức năng của các đối số biến và làm theo các bước đã cho -
- Xác định một hàm với tham số cuối cùng của nó là dấu chấm lửng và tham số ngay trước dấu chấm lửng luôn là số int sẽ đại diện cho số lượng đối số.
- Tạo va_list gõ biến trong định nghĩa hàm. Loại này được xác định trong tệp tiêu đề stdarg.h.
- Sử dụng int tham số và va_start macro để khởi chạy va_list biến thành danh sách đối số. Macro va_start được xác định trong tệp tiêu đề stdarg.h.
- Sử dụng va_arg macro và va_list để truy cập từng mục trong danh sách đối số.
- Sử dụng macro va_end để dọn dẹp bộ nhớ được gán cho va_list biến.
Bây giờ chúng ta hãy làm theo các bước trên và viết ra một hàm đơn giản có thể lấy số lượng tham số thay đổi và trả về giá trị trung bình của chúng -
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); //initialize valist for num number of arguments for (i = 0; i < num; i++) { //access all the arguments assigned to valist sum += va_arg(valist, int); } va_end(valist); //clean memory reserved for 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)); }
Đầu ra
Average of 2, 3, 4, 5 = 3.500000 Average of 5, 10, 15 = 10.000000