Đôi khi trong một số trường hợp, khi bạn muốn có một hàm, mà có thể nhận các tham số thay cho các tham số đã được định nghĩa trước.
Ngôn ngữ C cung cấp cho bạn giải pháp cho tình huống này và bạn được phép để định nghĩa một hàm mà chấp nhận các tham số hàm dựa vào các yêu cầu của bạn. Dưới đây là ví dụ cho việc định nghĩa các hàm như vậy:
int tenham(int, ... ) { . . . } int main() { tenham(1, 2, 3); tenham(1, 2, 3, 4); }
Bạn nên ghi nhớ rằng hàm tenham() có tham số cuối dạng tĩnh, ví dụ: ba dấu chấm (…) và tham số trước nó luôn luôn là int mà sẽ biểu diễn tổng số tham số biến được truyền. Để sử dụng tính năng này, bạn cần sử dụng Header file là stdarg.h mà cung cấp các hàm và macro để thực hiện tính năng này theo các bước:
- Định nghĩa một hàm với tham số cuối ở dạng tĩnh và tham số đằng trước nó luôn luôn là int mà biểu diễn số các tham số.
- Tạo một biến kiểu va_list trong định nghĩa hàm. Kiểu này được định nghĩa trong stdarg.h.
- Sử dụng tham số int và macro là va_start để khởi tạo biến va_list tới một danh sách tham số. Macro va_start này được định nghĩa trong stdarg.h.
- Sử dụng macro là va_arg và biến va_list để truy cập mỗi mục trong danh sách tham số.
- Sử dụng một macro là va_end để xóa bộ nhớ được chỉ định tới biến va_list.
Bây giờ chúng ta theo các bước trên và viết một hàm đơn giản mà có thể nhận các tham số và trả lại giá trị trung bình của chúng:
#include#include double giatriTB(int sothamso,...) { va_list thamso; double tong = 0.0; int i; /* khoi tao thamso cho sothamso (la so tham so) */ va_start(thamso, sothamso); /* truy cap tat ca tham so da duoc gan cho thamso */ for (i = 0; i < sothamso; i++) { tong += va_arg(thamso, int); } /* xoa bo nho danh rieng cho thamso */ va_end(thamso); return tong/sothamso; } int main() { printf("Gia tri trung binh cua 7, 8, 9, 10 la: %f\n", giatriTB(4, 7,8,9,10)); printf("Gia tri trung binh cua 11, 22, 33 la: %f\n", giatriTB(3, 11,22,33)); printf("\n===========================\n"); printf("Hoctv chuc cac ban hoc tot! \n"); }
Biên dịch và chạy chương trình C trên sẽ cho kết quả như dưới đây. Bạn nên ghi nhớ rằng hàm giatriTB() được gọi hai lần và trong mỗi lần thì tham số đầu tiên biểu diễn tổng các tham số biến được truyền. Chỉ có các tham số tĩnh sẽ được sử dụng để truyền số các tham số.