C में <stdarg.h> मैक्रोज़ का उपयोग करके वेरिएडिक फंक्शन्स (चर संख्या में पैरामीटर्स वाले फंक्शन्स) बनाए जा सकते हैं।
मुख्य मैक्रोज़
| मैक्रो | उद्देश्य |
|---|---|
va_list | आर्गुमेंट लिस्ट होल्ड करने के लिए टाइप |
va_start(va_list, last_fixed_arg) | आर्गुमेंट लिस्ट प्रारंभ करता है |
va_arg(va_list, type) | अगला आर्गुमेंट प्राप्त करता है और एडवांस करता है |
va_end(va_list) | क्लीनअप करता है |
va_copy(dest, src) | va_list कॉपी करता है (C99) |
उदाहरण: औसत निकालना
#include <stdio.h>
#include <stdarg.h>
double average(int count, ...) {
va_list args;
va_start(args, count);
double sum = 0.0;
for (int i = 0; i < count; i++) {
sum += va_arg(args, int); // प्रत्येक आर्गुमेंट int माना
}
va_end(args);
return sum / count;
}
int main() {
printf("Avg of 2,3,4,5: %.2f\n", average(4, 2, 3, 4, 5));
printf("Avg of 5,10,15: %.2f\n", average(3, 5, 10, 15));
return 0;
}
आउटपुट
Avg of 2,3,4,5: 3.50 Avg of 5,10,15: 10.00
महत्वपूर्ण नियम
- कम से कम एक फिक्स्ड पैरामीटर होना चाहिए (
countयहाँ)। va_argमें सही टाइप पास करें - गलत टाइप अनडिफाइंड बिहेवियर देता है।va_endहमेशा कॉल करें (कुछ प्लेटफॉर्म्स पर आवश्यक)।- कॉलर को आर्गुमेंट काउंट बताना होगा (या सेंटिनल वैल्यू उपयोग करें)।
वेरिएडिक फंक्शन के अन्य पैटर्न्स
// पैटर्न 2: सेंटिनल वैल्यू (जैसे NULL टर्मिनेटेड)
void print_strings(const char *first, ...) {
va_list args;
va_start(args, first);
for (const char *s = first; s != NULL; s = va_arg(args, const char*))
printf("%s ", s);
va_end(args);
}
// पैटर्न 3: फॉर्मेट स्ट्रिंग (printf स्टाइल)
void log_msg(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
vprintf(fmt, args); // vprintf, vfprintf, vsnprintf उपयोगी हैं
va_end(args);
}