সি-এ ফাংশনকে ফিক্সড সংখ্যক প্যারামিটার ছাড়া ভেরিয়েবল সংখ্যক আর্গুমেন্ট নেওয়ার জন্য <stdarg.h> হেডার ব্যবহার করা হয়। এর উদাহরণ হলো printf(), scanf()।
সিনট্যাক্স ও ধাপ
double average(int num, ...) { // num = আর্গুমেন্ট কাউন্ট
va_list valist; // ১. va_list ভেরিয়েবল ডিক্লেয়ার
va_start(valist, num); // ২. ইনিশিয়ালাইজ (লাস্ট ফিক্সড প্যারামিটার দিয়ে)
for (int i = 0; i < num; i++)
sum += va_arg(valist, int); // ৩. প্রতিটি আর্গুমেন্ট এক্সেস (টাইপ জানতে হবে)
va_end(valist); // ৪. ক্লিনআপ
return sum / num;
}
ম্যাক্রো/ফাংশন রেফারেন্স
| ম্যাক্রো/ফাংশন | ব্যবহার |
|---|---|
va_list | আর্গুমেন্ট লিস্ট ট্র্যাক করার টাইপ |
va_start(va_list, last_fixed_param) | লিস্ট শুরু করুন |
va_arg(va_list, type) | পরবর্তী আর্গুমেন্ট টাইপ অনুযায়ী এক্সেস করুন |
va_end(va_list) | ক্লিনআপ (বাধ্যতামূলক) |
va_copy(dest, src) | C99: লিস্ট কপি করুন (রিইউজের জন্য) |
পূর্ণ উদাহরণ: গড় বের করা
#include <stdio.h>
#include <stdarg.h>
double average(int num, ...) {
va_list valist;
double sum = 0.0;
va_start(valist, num);
for (int 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\n", average(3, 5, 10, 15));
return 0;
}
আউটপুট
Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000
গুরুত্বপূর্ণ সতর্কতা ⚠️
- টাইপ সেফটি নেই — কলার সঠিক টাইপ পাস করবে তা গ্যারান্টি নেই
- আর্গুমেন্ট কাউন্ট আলাদা পাস করতে হয় (যেমন
printf-এ ফরম্যাট স্ট্রিং থেকে বুঝা যায়) - ডিফল্ট আর্গুমেন্ট প্রোমোশন হয়:
float → double,char/short → int— তাইva_arg(valist, float)লিখলে ভুল হবে,doubleলিখতে হবে va_start-এর দ্বিতীয় আর্গুমেন্ট অবশ্যই লাস্ট ফিক্সড প্যারামিটার হতে হবে
আধুনিক C++ বিকল্প (C++11+)
// Variadic templates — টাইপ সেফ, কম্পাইল-টাইম
template<typename... Args>
double average(Args... args) {
return (args + ...) / sizeof...(args); // Fold expression (C++17)
}
// বা initializer_list (হোমোজেনাস টাইপের জন্য)
double avg(std::initializer_list<int> list) {
return std::accumulate(list.begin(), list.end(), 0.0) / list.size();
}